cython Tutoriel
Commencer avec cython
Recherche…
Remarques
Qu'est ce que Cython?
Le langage de programmation Cython enrichit Python par un typage statique de type C, la possibilité d'appeler directement les fonctions C et plusieurs autres fonctionnalités. Cela permet d'atteindre des performances de niveau C tout en utilisant une syntaxe de type Python.
Comment ça marche?
Le code Cython est compilé à l'aide du compilateur cython source-to-source pour créer du code C ou C ++, qui à son tour peut être compilé à l'aide d'un compilateur C. Cela permet de créer des extensions pouvant être importées depuis Python ou des exécutables.
Le principal gain de performances que Cython peut atteindre, contrairement à Python pur, provient du contournement de l’API CPython. Par exemple, lors de l'ajout de deux entiers, Python effectue une vérification de type pour chaque variable, trouve une fonction d'ajout qui satisfait les types trouvés et appelle cette fonction. Dans le code C généré par Cython, les types sont déjà connus et un seul appel de fonction est effectué. Par conséquent, Cython brille particulièrement pour les problèmes mathématiques dans lesquels les types sont clairs.
Comment l'utiliser pour accélérer mon code?
Un cas d'utilisation courant, lorsque vous essayez d'accélérer un programme en utilisant Cython, consiste à profiler le code et à déplacer les pièces coûteuses en calculs vers des modules Cython compilés. Cela permet de conserver la syntaxe Python pour la majeure partie du code et d'appliquer l'accélération là où c'est le plus nécessaire.
Installer Cython
Pour utiliser Cython, deux choses sont nécessaires. Le paquet Cython lui-même, qui contient le cython
source-à-source cython
et les interfaces Cython avec plusieurs bibliothèques C et Python (par exemple numpy). Pour compiler le code C généré par le compilateur cython
, un compilateur C est nécessaire.
Étape 1: Installation de Cython
Système agnostique
Cython peut être installé avec plusieurs systèmes de gestion de paquets indépendants du système. Ceux-ci inclus:
PyPI via pip ou easy_install:
$ pip install cython $ easy_install cython
anaconda en utilisant conda:
$ conda install cython
Canopy passionné en utilisant le gestionnaire de paquets enpkg:
$ enpkg cython
De plus, le code source peut être téléchargé depuis github et installé manuellement en utilisant:
$ python setup.py install
Ubuntu, Debian
Pour Ubuntu, les paquets cython
et cython3
sont disponibles. Notez que ceux-ci fournissent une version plus ancienne que les options d'installation mentionnées ci-dessus.
$ apt-get install cython cython3
les fenêtres
Pour Windows, un fichier .whl pouvant être installé à l'aide de pip est fourni par un tiers. Les détails sur l'installation d'un fichier .whl sous Windows peuvent être trouvés ici .
Étape 2: Installation d'un compilateur C
Pour compiler les fichiers C générés par Cython, un compilateur pour C et C ++ est nécessaire. Le compilateur gcc est recommandé et peut être installé comme suit.
Ubuntu, Debian
Le package build-essential
contient tout ce qui est nécessaire. Il peut être installé à partir des référentiels en utilisant:
$ sudo apt-get install build-essential
MAC
Les outils de développement XCode contiennent un compilateur de type gcc.
les fenêtres
MinGW (Minimalist GNU for Windows) contient une version Windows de gcc. Le compilateur de Visual Studio peut également être utilisé.
Bonjour le monde
Un fichier Cython pyx doit être traduit en code C ( numérisé ) et compilé avant de pouvoir être utilisé à partir de Python. Une approche courante consiste à créer un module d'extension qui est ensuite importé dans un programme Python.
Code
Pour cet exemple, nous créons trois fichiers:
-
hello.pyx
contient le code Cython. -
test.py
est un script Python qui utilise l'extension hello. -
setup.py
est utilisé pour compiler le code Cython.
bonjour.pyx
from libc.math cimport pow
cdef double square_and_add (double x):
"""Compute x^2 + x as double.
This is a cdef function that can be called from within
a Cython program, but not from Python.
"""
return pow(x, 2.0) + x
cpdef print_result (double x):
"""This is a cpdef function that can be called from Python."""
print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))
test.py
# Import the extension module hello.
import hello
# Call the print_result method
hello.print_result(23.0)
setup.py
from distutils.core import Extension, setup
from Cython.Build import cythonize
# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))
Compiler
Cela peut être fait en utilisant cython hello.pyx
pour traduire le code en C, puis le compiler en utilisant gcc
. Un moyen plus simple est de laisser les agents manipuler ceci:
$ ls
hello.pyx setup.py test.py
$ python setup.py build_ext --inplace
$ ls
build hello.c hello.cpython-34m.so hello.pyx setup.py test.py
Le fichier objet partagé (.so) peut être importé et utilisé à partir de Python, nous pouvons maintenant exécuter le test.py
:
$ python test.py
(23.0 ^ 2) + 23.0 = 552.0