Optimizando Python con Cython
Python es un lenguaje de programación muy utilizado hoy en día, entre otras razones por que es cómodo para programar a alto nivel, tiene muchas librerías y es un código fácilmente mantenible. A pesar de todas estas ventajas, cabe destacar que es notoriamente lento, por lo que es conveniente conocer algunas herramientas que permitan acelerar el código Python.
Python versus Cython
Una de las formas en que se puede acelerar Python es combinándolo con código en Cython. Para ilustrar esto, se tomará como ejemplo el cálculo del número Pi utilizando el método de Monte Carlo (ejemplo extraído de la página de Numba, otra forma para acelerar Python).
Acelerar Phyton
Es un código muy sencillo, en el cual se calcula el número pi sampleando un número aleatorio de puntos y utilizando el ratio entre el área de un cuadrado y un círculo. El área del círculo es estimada como el número de puntos dentro del círculo, y la del cuadrado como el total de puntos.
Montecarlo
Utilizando 100.000 puntos, la función de Python tarda 38.5ms, mientras que la de Cython tarda 2.98ms, es decir, 12.92x veces más rápido.
¿Qué es Cython?
Cython es un lenguaje que se escribe de forma muy similar a Python, pero permite la utilización de librerías y variables de tipo C. Por tanto, se puede conseguir la velocidad de C manteniendo la simplicidad de sintaxis proporcionada por Python. Además, una de sus grandes versatilidades es que se pueden mezclar definiciones explícitas de variables C con variables de Python, como pueden ser los diccionarios.
Sin embargo, programar en Cython también comporta una serie de inconvenientes, como la necesidad de compilar el código por separado antes de ejecutar el programa. También está el hecho de que comparado con lenguajes como C o Fortran, no tiene un soporte tan bueno para la paralelización de memoria.
¿Cómo usar Cython?
Para que un programa de Cython pueda funcionar se necesitan tres archivos. El primero y más importante es el que contiene todo el código en Cython, con extensión .pyx. En el ejemplo del cálculo del número pi se puede ver cómo dentro de este código se puede acceder a librerías C, así como declarar las variables con su tipo para incrementar la velocidad.
También es importante destacar la declaración de las funciones, que pueden ser declaradas de tres formas diferentes: def, cpdef y cdef.
El primero indica que la función solo puede ser accedida desde una función de Python, el segundo que se puede acceder desde Python y desde Cython, y el último que únicamente es accesible desde Cython.
El segundo de los archivos necesarios es el setup.py, que genera la extensión de Cython al compilarlo.
Y, por último, el tercer script es el de Python, el cual llama al fichero generado por el setup.py para poder importar el código de Cython como si fuera una librería, y así poder acceder a sus funciones como se haría con cualquier otra.
(Image by DavidBrooksPokorny – Own work, CC BY-SA 3.0, wikimedia)
Archivos Cython
De esta forma, para partes del código particularmente lentas como pueden ser loops muy largos donde no se pueda utilizar Numpy o para computaciones matemáticas, Cython puede ayudar a acelerar la ejecución del programa.
Esperamos que te haya sido útil este artículo. Si tienes entre manos algún proyecto de ingeniería y crees que podemos ayudarte, aquí te dejo el enlace donde nos podrás contactar y explicarnos más a cerca de ello.