jueves, diciembre 16, 2010

Cython: Librería de Python para extensiones interactuando con C

Hace unos días estoy probando Cython, una librería que permite generar extensiones para Python escritas en un lenguaje muy parecido a Python, pero con la posibilidad de utilizar funciones de C.

Para instalarlo podemos usar pip o easy_install:

$ easy_install cython # o pip install cython

Un ejemplo muy sencillo, que envuelve a dos funciones de stdlib, que acabamos de hacer con v4n.


# b.pyx


cdef extern from "stdlib.h":
        int strlen(char *s)
        char *strdup(char *)




def longitud(s):
        return strlen(s)


def duplicar(s):
        cdef char *n = strdup(s)
        return unicode(n)



Es un ejemplo muy sencillo y que trata de demostrar que sencillo es envolver las funciones, ahora veamos como compilarlo. Para esto creamos un archivo setup.py con lo siguiente, suponeindo que nombramos a lo anterior b.pyx:


from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ext_modules = [Extension("b", ["b.pyx"])]


setup(
  name = 'b',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

Finalmente, para compilar, 

$ python setup.py  build_ext --inplace

Listo, ahora podemos hacer:

$ python
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import b
>>> dir(b)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__test__', 'duplicar', 'longitud']
>>> b.longitud('alfa')
4
>>> u = b.duplicar('una cadena')
>>> print u
una cadena
>>> u
u'una cadena'


Muy sencillo, hay una inferencia de tipos muy interesante para cuestiones básicas. En prymatex estoy intentando wrapear oniguruma en una forma similar a re, porque como ya mencioné en algún momento, las definiciones de sintaxis están hechas en este formato. Si les interesa chusmear, está por acá (hasta que aprenda a usar git submodule).

No hay comentarios.: