Posts Tagged ‘ cython

Optimizando Python con Cython

Python es un lenguaje interpretado, algo que hace muy fácil y cómodo el desarrollo pero que lo hace excesivamente lento en cálculo.

Para hacer el lenguaje más eficiente podemos utilizar Cython, un lenguage que basicamente traduce partes del código Python en C y lo compila en código máquina.

Este código compilado luego puede ser cargado desde cualquier módulo Python de forma totalmente trasparente.

El uso de Cython es relativamente simple, una vez instalado (mediante easy_install p.e.), trabajaremos con ficheros .pyx que serán en su mayoría código Python con ciertas optimizaciones, que explicaré a continuación.

Podríamos utilizar bibliotecas en C/C++ y hacer uso de ciertas funciones más eficientemente. Por ejemplo, para usar la función de sqrt() de math.h;

cdef extern from "math.h":
    double sqrt(double)

O bien eliminar el tipado dinámico en ciertas variables, mediante:

cdef int a
cdef double b

Donde las variables a y b corresponden a un entero y coma flotante, respectivamente y podrán ser usadas de forma normal.

Y por último, podríamos eliminar el tipado dinámico del retorno de una función con;

cdef int func():
    return 1

Para compilar copiamos el siguiente script como setup.py y ejecutamos python setup.py build_ext –inplace. Con él compilaríamos el módulo my_module contenido en el fichero my_module.pyx como my_module.so y quedará listo para ser importado en cualquier script Python.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
ext_modules = [Extension("my_module", ["my_module.pyx"],libraries=[])]
 
setup(
  name = 'my_module',
  cmdclass = {'build_ext': build_ext},
  include_dirs=[],
  ext_modules = ext_modules
)

Algo realmente curioso es que la importación del módulo se hace de forma totalmente transparente, de forma que, si no existiera el fichero my_module.so cargaría el módulo my_module.py sin optimizar.

Podemos añadir un poco más de complejidad al script de compilación;

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
 
ext_modules = [Extension("my_module", ["my_module.pyx"],libraries=["m"])]
 
setup(
  name = 'my_module',
  cmdclass = {'build_ext': build_ext},
  include_dirs=[numpy.get_include()],
  ext_modules = ext_modules
)

Aquí estamos indicando que vamos a utilizar la biblioteca libm de C (math.h) y la biblioteca numpy cuyas extensiones ya se encuentran compiladas en C.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedios caseros usado para tratar de varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.