cython Tutorial
Iniziare con Cython
Ricerca…
Osservazioni
Cos'è Cython?
Il linguaggio di programmazione Cython arricchisce Python con la tipizzazione statica di tipo C, la capacità di chiamare direttamente funzioni C e molte altre funzionalità. Ciò consente di raggiungere prestazioni a livello C pur utilizzando una sintassi simile a Python.
Come funziona?
Il codice Cython è compilato usando il compilatore cython source-to-source per creare codice C o C ++, che a sua volta può essere compilato usando un compilatore C. Ciò consente di creare estensioni che possono essere importate da Python o eseguibili.
Il guadagno di prestazioni principale che Cython può raggiungere rispetto ai puri steli Python aggira l'API CPython. Ad esempio quando si aggiungono due interi, Python esegue un controllo di tipo per ogni variabile, trova una funzione di aggiunta che soddisfa i tipi trovati e chiama tale funzione. Nel codice C generato da Cython, i tipi sono già noti e viene effettuata una sola chiamata a funzione. Quindi, Cython brilla soprattutto per problemi matematici in cui i tipi sono chiari.
Come posso usarlo per velocizzare il mio codice?
Un caso d'uso comune, quando si tenta di accelerare un programma usando Cython, è di profilare il codice e spostare le parti computazionalmente costose in moduli Cython compilati. Ciò consente di mantenere la sintassi di Python per la maggior parte del codice e applicare la velocità laddove è più necessaria.
Installare Cython
Per utilizzare Cython sono necessarie due cose. Il pacchetto Cython stesso, che contiene il cython
source-to-source e le interfacce Cython a diverse librerie C e Python (per esempio numpy). Per compilare il codice C generato dal compilatore cython
, è necessario un compilatore C.
Passaggio 1: installazione di Cython
Sistema agnostico
Cython può essere installato con diversi sistemi di gestione pacchetti agnostici di sistema. Questi includono:
PyPI via pip o easy_install:
$ pip install cython $ easy_install cython
anaconda usando conda:
$ conda install cython
Enthought canopy usando il gestore di pacchetti enpkg:
$ enpkg cython
Anche il codice sorgente può essere scaricato da github e installato manualmente usando:
$ python setup.py install
Ubuntu, Debian
Per Ubuntu sono disponibili i pacchetti cython
e cython3
. Si noti che questi forniscono una versione precedente rispetto alle opzioni di installazione menzionate sopra.
$ apt-get install cython cython3
finestre
Per Windows, un file .whl che può essere installato tramite pip è fornito da una terza parte. I dettagli sull'installazione di un file .whl su Windows sono disponibili qui .
Passaggio 2: installazione di un compilatore C
Per compilare i file C generati da Cython, è necessario un compilatore per C e C ++. Il compilatore gcc è raccomandato e può essere installato come segue.
Ubuntu, Debian
Il pacchetto build-essential
contiene tutto ciò che è necessario. Può essere installato dai repository usando:
$ sudo apt-get install build-essential
MAC
Gli strumenti per sviluppatori XCode contengono un compilatore simile a gcc.
finestre
MinGW (Minimalist GNU per Windows) contiene una versione Windows di gcc. È anche possibile utilizzare il compilatore di Visual Studio.
Ciao mondo
Un file python di Cython deve essere tradotto in codice C ( criptato ) e compilato prima di poter essere utilizzato da Python. Un approccio comune è quello di creare un modulo di estensione che viene poi importato in un programma Python.
Codice
Per questo esempio creiamo tre file:
-
hello.pyx
contiene il codice Cython. -
test.py
è uno script Python che usa l'estensione ciao. -
setup.py
è usato per compilare il codice Cython.
hello.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))
compilazione
Questo può essere fatto usando cython hello.pyx
per tradurre il codice in C e poi compilarlo usando gcc
. Un modo più semplice è lasciare che le distutils gestiscano questo:
$ 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
Il file oggetto condiviso (.so) può essere importato e utilizzato da Python, quindi ora possiamo eseguire test.py
:
$ python test.py
(23.0 ^ 2) + 23.0 = 552.0