Buscar..


Observaciones

¿Qué es Cython?

El lenguaje de programación Cython enriquece la escritura estática tipo Python by C, la capacidad de llamar directamente a las funciones C y muchas otras características. Esto permite alcanzar un rendimiento de nivel C sin dejar de utilizar una sintaxis similar a Python.

¿Como funciona?

El código de Cython se compila utilizando el compilador de fuente a fuente de cython para crear código C o C ++, que a su vez se puede compilar utilizando un compilador de C. Esto permite crear extensiones que se pueden importar desde Python o ejecutables.

La principal ganancia de rendimiento que Cython puede alcanzar en contraste con Python puro se deriva de pasar por alto la API de CPython. Por ejemplo, al agregar dos enteros, Python realiza una verificación de tipo para cada variable, encuentra una función de adición que satisface los tipos encontrados y llama a esa función. En el código C generado por Cython, los tipos ya se conocen y solo se realiza una llamada a la función. Por lo tanto, Cython brilla especialmente para problemas matemáticos en los que los tipos son claros.

¿Cómo lo uso para acelerar mi código?

Un caso de uso común, cuando se intenta acelerar un programa usando Cython, es perfilar el código y mover las partes computacionalmente caras a los módulos compilados de Cython. Esto permite conservar la sintaxis de Python para la mayor parte del código y aplicar la aceleración donde más se necesita.

Instalando Cython

Para usar Cython se necesitan dos cosas. El propio paquete de Cython, que contiene el cython fuente a fuente y las interfaces de Cython a varias bibliotecas de C y Python (por ejemplo, numpy). Para compilar el código C generado por el compilador de cython , se necesita un compilador de C.

Paso 1: Instalando Cython

Sistema agnóstico

Cython se puede instalar con varios sistemas de gestión de paquetes independientes del sistema. Éstos incluyen:

  1. PyPI a través de pip o easy_install:

    $ pip install cython
    $ easy_install cython
    
  2. anaconda utilizando conda:

    $ conda install cython
    
  3. Piensa en dosel usando el gestor de paquetes enpkg:

    $ enpkg cython
    

También el código fuente se puede descargar desde github e instalarse manualmente usando:

$ python setup.py install

Ubuntu, Debian

Para Ubuntu los paquetes cython y cython3 están disponibles. Tenga en cuenta que estos proporcionan una versión más antigua que las opciones de instalación mencionadas anteriormente.

$ apt-get install cython cython3

Windows

Para Windows, un archivo .whl que se puede instalar utilizando pip es proporcionado por un tercero. Los detalles sobre la instalación de un archivo .whl en Windows se pueden encontrar aquí .


Paso 2: Instalar un compilador de C

Para compilar los archivos C generados por Cython, se necesita un compilador para C y C ++. Se recomienda el compilador gcc y se puede instalar de la siguiente manera.

Ubuntu, Debian

El paquete build-essential contiene todo lo que se necesita. Se puede instalar desde los repositorios utilizando:

$ sudo apt-get install build-essential

MAC

Las herramientas de desarrollo de XCode contienen un compilador similar a gcc.

Windows

MinGW (Minimalist GNU para Windows) contiene una versión de Windows de gcc. También se puede utilizar el compilador de Visual Studio.

Hola Mundo

Un archivo Pyth de Cython debe traducirse al código C ( citonizado ) y compilarse antes de que se pueda usar desde Python. Un enfoque común es crear un módulo de extensión que luego se importa en un programa Python.

Código

Para este ejemplo creamos tres archivos:

  • hello.pyx contiene el código de Cython.
  • test.py es un script de Python que usa la extensión hello.
  • setup.py se utiliza para compilar el código de Cython.

hola.pyx

from libc.math cimport pow

cdef double square_and_add (double x):
    """Compute x^2 + x as double.

    This is a cdef function that can be called from within
    a Cython program, but not from Python.
    """
    return pow(x, 2.0) + x

cpdef print_result (double x):
    """This is a cpdef function that can be called from Python."""
    print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))

test.py

# Import the extension module hello.
import hello

# Call the print_result method 
hello.print_result(23.0)

setup.py

from distutils.core import Extension, setup
from Cython.Build import cythonize

# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))

Compilando

Esto se puede hacer usando cython hello.pyx para traducir el código a C y luego compilarlo usando gcc . Una forma más fácil es dejar que distutils maneje esto:

$ ls
hello.pyx  setup.py  test.py
$ python setup.py build_ext --inplace
$ ls
build  hello.c  hello.cpython-34m.so  hello.pyx  setup.py  test.py

El archivo de objeto compartido (.so) se puede importar y usar desde Python, por lo que ahora podemos ejecutar el test.py :

$ python test.py
(23.0 ^ 2) + 23.0 = 552.0 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow