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:

  1. PyPI via pip o easy_install:

    $ pip install cython
    $ easy_install cython
    
  2. anaconda usando conda:

    $ conda install cython
    
  3. 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 


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow