Optimitzant Python amb Cython

Python és un llenguatge de programació molt utilitzat actualment, entre altres raons perquè és còmode per programar a alt nivell, té moltes llibreries i és un codi fàcilment mantenible. Malgrat tots aquests avantatges, cal destacar que és notòriament lent, i per això és convenient conèixer algunes eines que permetin accelerar el codi Python.

Python vs. Cython

Una de les formes en què es pot accelerar Python és combinant-ho amb codi a Cython. Per il·lustrar això, es prendrà com a exemple el càlcul del número Pi utilitzant el mètode de Monte Carlo (exemple extret de la pàgina de Numba, una altra forma per accelerar Python).

Accelerar Phyton
Accelerar Phyton

És un codi molt senzill, en el qual es calcula el número pi samplejant un nombre aleatori de punts i utilitzant la relació entre l’àrea d’un quadrat i d’un cercle. L’àrea del cercle és estimada com la quantitat de punts dins del cercle, i la del quadrat com el número total de punts.

Montecarlo
Montecarlo

Utilitzant 100.000 punts, la funció de Python triga 38.5ms, mentre que la de Cython triga 2.98ms, és a dir, 12.92x vegades més ràpid.

Què és Cython?

Cython és un llenguatge que s’escriu de forma molt similar a Python, però permet la utilització de llibreries i variables de tipus C. Per tant, es pot aconseguir la velocitat de C mantenint la simplicitat de sintaxi proporcionada per Python. A més, una de les seves grans versatilitats és que es poden barrejar definicions explícites de variables C amb variables de Python, com poden ser els diccionaris.

No obstant això, programar en Cython també comporta una sèrie d’inconvenients, com la necessitat de compilar el codi per separat abans d’executar el programa. També hi ha el fet que comparat amb llenguatges com C o Fortran, no té un suport tan bo per a la paral·lelització de memòria.

Com utilitzar cython?

Perquè un programa de Cython pugui funcionar es necessiten tres arxius. El primer i més important és el que conté tot el codi en Cython, amb extensió .pyx. En l’exemple de calcular el número pi es pot veure com dins d’aquest codi es pot accedir a llibreries C, així com declarar les variables amb el seu tipus per incrementar la velocitat.

També és important destacar la declaració de les funcions, que poden ser declarades de tres formes diferents: def, cpdef i cdef.

El primer indica que la funció només es pot accedir des d’una funció de Python, el segon que es pot accedir des de Python i des de Cython, i l’últim que únicament és accessible des de Cython.

El segon dels arxius necessaris és el setup.py, que genera l’extensió de Cython quan es compila.

Finalment, el tercer script és el de Python, el qual crida all fitxer generat pel setup.py per poder importar el codi de Cython com si fos una llibreria, i així poder accedir a les seves funcions com es faria amb qualsevol altra.

(Image by DavidBrooksPokorny – Own work, CC BY-SA 3.0, wikimedia)

Arxius Cython
Arxius Cython

D’aquesta manera, per parts del codi particularment lentes com poden ser loops molt llargs on no es pugui utilitzar Numpy o per computacions matemàtiques, Cython pot ajudar a accelerar l’execució del programa.

 

Esperem que t’hagi estat útil aquest article. Si tens entre mans algun projecte d’enginyeria i creus que podem ajudar-te, aquí et deixo l’enllaç on ens podràs contactar i explicar-nos més a prop d’això.