Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

Accelerare Python con Cython

by
Difficulty:IntermediateLength:ShortLanguages:

Italian (Italiano) translation by Mirko Pizii (you can also view the original English article)

Cython è un superset di Python che ti permette di migliorare significativamente la velocità del tuo codice. È possibile aggiungere dichiarazioni di tipo opzionale per benefici ancora maggiori. Cython traduce il codice in C / C ++ ottimizzato che viene compilato in un modulo di estensione Python.

In questo tutorial imparerai a installare Cython, ottenere un immediato miglioramento delle prestazioni del tuo codice Python, e quindi come avere vantaggi da Cython aggiungendo tipi e profilando il tuo codice. Infine, imparerai su argomenti più avanzati come l'integrazione con il codice C/C++ e NumPy che puoi esplorare ulteriormente per guadagni ancora maggiori.

Contando i tripli pitagorici

Pitagora era un matematico e filosofo greco. È famoso per il suo teorema pitagorico, che afferma che in un triangolo a destra, la somma di quadrati delle gambe dei triangoli è uguale al quadrato dell'ipotenusa. I tripli pitagorici sono tre numeri interi positivi a, b e c tali che a² + b² = c². Ecco un programma che trova tutti i tripli pitagorici i cui membri non sono superiori ai limiti previsti.

Apparentemente ci sono 881 triplici, e ci sono voluti poco meno di 14 secondi per scoprirlo. Non è troppo lungo, ma abbastanza a lungo per essere fastidioso. Se vogliamo trovare più triplici fino ad un limite superiore, dobbiamo trovare un modo per farlo andare più veloce.

Si scopre che ci sono algoritmi sostanzialmente migliori, ma oggi ci stiamo concentrando sulla creazione di Python più veloce con Cython, non sul miglior algoritmo per trovare i tripli di pitagora.

Boost facile con pyximport

Il modo più semplice per utilizzare Cython è quello di utilizzare la funzionalità speciale di pyximport. Questa è un'istruzione che compila il codice Cython al volo e ti permette di godere dei vantaggi dell'ottimizzazione nativa senza troppi problemi.

È necessario inserire il codice in cythonize nel proprio modulo, scrivere una riga di installazione nel programma principale e quindi importarla come al solito. Vediamo come dovrebbe essere. Ho trasferito la funzione al proprio file chiamato pythagorean_triples.pyx. L'estensione è importante per Cython. La linea che attiva Cython è import pyximport; pyximport.install(). Quindi importa semplicemente il modulo con la funzione count() e successivamente invoca la funzione principale.

La funzione pura di Python era più lunga del 50%. Abbiamo ottenuto questa spinta aggiungendo una singola linea. Non è affatto male.

Crea il tuo modulo di estensione

Mentre pyximport è davvero conveniente durante lo sviluppo, funziona solo su moduli Python puri. Spesso quando si ottimizza il codice si desidera fare riferimento alle librerie naturali C o ai moduli di estensione Python.

Per supportarli, e anche per evitare la compilazione dinamica di ogni esecuzione, è possibile costruire il proprio modulo di estensione Cython. È necessario aggiungere un piccolo file setup.py e ricordarsi di costruirlo prima di eseguire il programma ogni volta che si modifica il codice Cython. Ecco il file setup.py:

Successivamente hai bisogno di compilarlo:

Come si può vedere dall'output, Cython ha generato un file C chiamato pythagorean_triples.c e compila un file specifico di piattaforma .so, che è il modulo di estensione che Python può ora importare come qualsiasi altro modulo di estensione nativo.

Se sei curioso, dai un'occhiata al codice C generato. È molto lungo (2789 righe), ottuso e contiene molte cose extra necessarie per lavorare con l'API di Python. Andiamo a rimuovere pyximport ed eseguiamo il nostro programma:

Il risultato è praticamente uguale a quello con pyximport. Tuttavia, tieni presente che sto misurando solo il tempo di esecuzione del codice con cython. Non sto misurando quanto tempo ci vuole pyximport per compilare il codice codificato con cython al volo. In grandi programmi, questo può essere significativo.

Aggiungere tipi al tuo codice

Andiamo al livello successivo. Cython è più di Python e aggiunge la tipizzazione opzionale. Qui definisco solo tutte le variabili come numeri interi e le prestazioni skyrocket:

Sì. È corretto. Definendo un paio di numeri interi, il programma viene eseguito in meno di 57 millisecondi, rispetto a più di 13 secondi con Python puro. Questo è quasi un miglioramento di 250x.

Profiling del codice

Ho usato il modulo di tempo di Python, che misura il tempo della parete ed è abbastanza buona la maggior parte del tempo. Se si desidera una misurazione più precisa dei piccoli frammenti di codice, si consiglia di utilizzare il modulo timeit. Ecco come misurare le prestazioni del codice utilizzando timeit:

La funzione timeit() richiede un'istruzione da eseguire, un codice di installazione non misurato e il numero di volte per eseguire il codice misurato.

Argomenti avanzati

Ho appena abbozzato la superficie qui. Puoi fare molto di più con Cython. Ecco alcuni argomenti che possono migliorare ulteriormente le prestazioni del codice o consentire a Cython di integrarsi con altri ambienti:

  • Chiamare un codice C
  • Interagire con le API C di Python e con GIL
  • Usare C++ in Python
  • Portare il codice Cython su PyPY
  • Usare il parallelismo
  • Cython e NumPy
  • Condividere dichiarazioni tra moduli Cython

Conclusione

Cython può produrre due ordini di grandezza di miglioramento delle prestazioni ad un vero piccolo sforzo. Se sviluppi software non triviale in Python, Cython è un non-brainer. Ha un po' di sovraccarico, e puoi presentarla gradualmente al codice base.

Inoltre, non esitate a vedere ciò che disponiamo per la vendita e per lo studio sul marketplace, e non esitate a fare domande e fornire i tuoi preziosi feedback utilizzando il feed sotto.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.