Cython
| Cython | |
|---|---|
|
| |
| Donnee de base | |
| Paradigmes : | multi-paradigmatique |
| Année d'édition: | 28 juillet 2007 |
| Développeur: | Robert Bradshaw, Stefan Behnel et coll. |
| Version actuelle | 0.29.21 (8 juillet 2020) |
| Taper : | fort , statique , dynamique (" typage canard ") |
| Influencé par: | Python , C , C ++ |
| Système d'exploitation : | Linux , système de type Unix |
| Licence : | Licence Apache, version 2.0, licence Apache |
| cython.org | |
Cython est un langage de programmation universel qui est largement compatible avec Python . Comme ceux-ci, il prend en charge divers paradigmes de programmation tels que la programmation orientée objet , orientée aspect et fonctionnelle . Le principal avantage réside cependant dans la traduction dans le langage cible C, qui permet à la fois des performances élevées par rapport à l' interpréteur Python standard et une interaction directe avec du code externe écrit en C, C ++ ou Fortran .
Les principales applications sont la connexion de l' extérieur bibliothèques au CPython - interprète , ainsi que l'accélération du code Python. Le compilateur Cython peut également être utilisé pour compiler des modules Python purs.
Le code généré n'est pas autonome, mais nécessite un environnement d'exécution compatible CPython . A la fois la génération de modules binaires ("module d'extension"), qui peuvent être importchargés dynamiquement dans l'interpréteur Python via la commande, et l'intégration de l'éditeur de liens de l'interpréteur CPython dans le module généré, de sorte qu'un exécutable Le programme est créé ( intégration ).
Historique du développement
Cython est basé sur Pyrex de Greg Ewing (publié pour la première fois le 4 avril 2002). En juillet 2007, le compilateur Cython a été séparé de Pyrex en tant que projet indépendant et ouvertement développé par Robert Bradshaw et Stefan Behnel. Depuis lors, des tentatives ont été faites pour garder les deux compilateurs largement compatibles, bien que Cython utilise des optimisations de grande envergure et réalise une plus grande compatibilité avec le code Python. Les différences importantes avec Pyrex sont décrites dans la documentation Cython.
Origine du nom
Le nom Cython est un mot valise des deux langages de programmation sous-jacents: Python et C.
objectifs
Le projet Cython s'est fixé pour objectif de développer un compilateur pour le code Python normal qui offre les performances les plus élevées possible et une intégration étendue avec du code écrit en C, C ++ et Fortran grâce à un typage statique supplémentaire (explicite).
Cython est un compilateur d'optimisation, mais pas dans le sens habituel d'un compilateur qui génère du code binaire . Au contraire, la traduction en code C permet de laisser de nombreuses optimisations fondamentales et ajustements de plate-forme à un compilateur C. Le compilateur Cython peut ainsi se limiter à des optimisations de haut niveau au niveau AST .
Le code C généré par Cython est largement portable en termes de plates-formes (processeur, compilateur C et système d'exploitation) et de versions CPython. Actuellement (version 0.28.5) les versions 2.6 et 2.7 de CPython ainsi que toutes les versions 3.3 sont prises en charge. Les plates-formes testées incluent macOS , Windows et, surtout, diverses distributions Linux avec des versions système 32 bits et 64 bits .
caractéristiques
La combinaison de Python et C permet à Cython de mapper un très large éventail d'exigences. La programmation de haut niveau avec les types de données Python, les constructions de langage et la gestion automatique de la mémoire, ainsi que la programmation très proche du C avec les types de données C, les fonctions C et la gestion manuelle de la mémoire est possible. Les deux peuvent être combinés à volonté et l'interaction avec du code Python pur (non compilé) est tout aussi nativement possible que l'interaction avec du code C ou C ++, ce qui permet une approche très fine lors de l'optimisation du code Cython. Toute partie du code peut être écrite en Python pur, compilée avec Cython, optimisée avec des types de données statiques ou même portée en C, selon les besoins. De cette façon, Cython prend en charge le principe selon lequel la majeure partie de l'exécution d'un programme est créée dans une très petite partie du code source , c'est-à-dire que l'optimisation d'une petite partie du programme peut apporter un très grand gain de performances, tandis que pour la majorité du code une vitesse de développement élevée et une les faibles besoins d'entretien sont plus importants que la vitesse d'exécution la plus élevée possible.
Le langage de programmation réalise l'intégration du langage entre Python et C principalement via des types de données. Différentes constructions de langage Python peuvent être appliquées à la fois aux types de données Python et aux types de données C. Un exemple est la boucle 'for', qui est une boucle foreach en Python, c'est-à-dire qu'elle peut s'exécuter sur n'importe quel conteneur itérable (par exemple, des listes ou des fichiers). En Cython, cette boucle peut également s'exécuter sur des listes C ++, des tableaux C et des sous-tableaux, ainsi que sur des sections de pointeur (tranches, par exemple ptr[2:8]pour les décalages 2–7). En outre, il existe une conversion automatique entre différents types de données Python et types de données C, à la fois pour les types scalaires (nombres) et pour les chaînes de caractères et les types de données structurées (par exemple, les types de structure C et les dictionnaires Python).
performance
La plupart des optimisations effectuées par le compilateur Cython entraînent automatiquement une spécialisation du code C généré. Pour ce faire, le compilateur utilise des déclarations de type statique explicite et une inférence de type (simple) pour générer du code C spécialisé pour les types de données utilisés et certains modèles de code. Une grande partie des optimisations du compilateur Cython concerne les boucles, car une grande partie du temps d'exécution total s'accumule généralement ici.
Les structures de contrôle (en particulier les boucles) sont traduites beaucoup plus rapidement avec Cython et un compilateur C que lorsqu'elles sont interprétées par CPython. Cela est dû aux optimisations optimistes et à l'inférence de type. Cela signifie que le code Python compilé en Cython s'exécute généralement plus rapidement que dans CPython 2.6.x même sans déclarations de type explicites, bien que les performances relatives dépendent naturellement du code en question. Cependant, grâce à la déclaration statique des types de données et à la spécialisation résultante du code C, il est généralement possible de réaliser une accélération multiple. Surtout avec les calculs mathématiques, les améliorations d'exécution résultent souvent d'un facteur de cent à mille. En comparaison, l'accélération typique via le compilateur Python JIT Psyco est d'environ quatre à cent fois , avec PyPy dans certains cas jusqu'à douze fois.
Le code généré par Cython pour les fonctions est optimisé pour un déballage et une conversion rapides des paramètres d'appel. Par conséquent, appeler du code natif vers Python via un wrapper Cython est généralement plus rapide que les autres implémentations de wrapper pour Python.
zone d'application
Les domaines d'application les plus importants de Cython sont la connexion de bibliothèques externes à l'interpréteur CPython, ainsi que l'accélération du code Python, en particulier dans les calculs mathématiques et les algorithmes intensifs en calcul .
Par exemple, le système d'algèbre informatique SageMath est largement basé sur du code Cython. Ceci est utilisé à la fois pour la mise en œuvre d'algorithmes mathématiques et pour la connexion de codes externes en C, C ++ et Fortran. Cython prend également en charge une interaction très efficace avec NumPy - matrices , qui, sur la base de ces calculs, sont grandement simplifiées.
La bibliothèque XML haute performance lxml est largement implémentée en Cython. Les bibliothèques C externes libxml2 et libxslt sont liées à l'interpréteur Python.
Un autre exemple de l'environnement de développement Cython Core est la bibliothèque MPI mpi4py. Il connecte diverses implémentations MPI à CPython.
Dans l'index des packages Python, il existe une courte liste d'autres bibliothèques implémentées en Cython.
Projets connexes et similaires
- Pyrex - prédécesseur de Cython
- Unladen Swallow - environnement d'exécution CPython optimisé; basé sur LLVM
- PyPy - Framework de compilateur JIT et runtime Python lui-même écrit dans un dialecte Python (RPython)
- Psyco - compilateur JIT spécialisé et optimiseur de code pour l' environnement d'exécution CPython
- Shed Skin - langage de programmation de type Python à typage statique qui est compilé selon C ++
Preuve individuelle
- ↑ Version 0.29.21 . 8 juillet 2020 (consulté le 9 juillet 2020).
- ↑ github.com . (consulté le 2 février 2020).
- ↑ Cython: C-Extensions pour Python . (consulté le 8 juillet 2018).
- ↑ versions originales du prédécesseur Pyrex
- ↑ La compatibilité avec Python 2 est l'objectif déclaré de la future version 1.0 de Cython ( souvenir de l' original du 10 août 2011 dans les archives Internet ) Info: Le lien de l' archive a été automatiquement inséré et pas encore vérifié. Veuillez vérifier le lien d'origine et d'archive conformément aux instructions , puis supprimer cet avis.
- ↑ slices sur docs.python.org, consulté le 2 août 2018
- ↑ gmane.comp.python.cython.devel - Comparaison pybench de Cython et CPython 2.6.2
- ↑ gmane.comp.python.cython.devel - Passage d'un pointeur de Python ( souvenir de l' original du 14 février 2017 dans les archives Internet ) Info: Le lien de l' archive a été automatiquement inséré et pas encore vérifié. Veuillez vérifier le lien d'origine et d'archive conformément aux instructions , puis supprimer cet avis.
- ^ Psyco - Introduction
- ↑ Vitesse de PyPy 1.4 par rapport à CPython 2.6.2 avec / sans Psyco
- ↑ Benchmarks de wrapper C ++ pour différents générateurs de wrapper Python (sans Cython) ( Mémento de l' original du 4 avril 2015 dans Internet Archive ) Info: Le lien de l' archive a été automatiquement inséré et pas encore vérifié. Veuillez vérifier le lien d'origine et d'archive conformément aux instructions , puis supprimer cet avis.
- ↑ Benchmarks de wrapper C ++ pour Cython, Boost.Python et PyBindGen
- ↑ Liste des packages Python implémentés en Cython sur PyPI