Cython ( / ˈ s aɪ θ ɒ n / ) es un superconjunto del lenguaje de programación Python , que permite a los desarrolladores escribir código Python (con extensiones de sintaxis opcionales inspiradas en C ) que produce un rendimiento comparable al de C. [5] [6]
Cython es un lenguaje compilado que se utiliza normalmente para generar módulos de extensión CPython . El código anotado similar a Python se compila en C y luego se envuelve automáticamente en código de interfaz , lo que produce módulos de extensión que se pueden cargar y usar con código Python normal mediante la declaración de importación, pero con una sobrecarga computacional significativamente menor en tiempo de ejecución . Cython también facilita la envoltura de código C o C++ independiente en módulos importables de Python.
Cython está escrito en Python y C y funciona en Windows , macOS y Linux , produciendo archivos fuente en C compatibles con CPython 2.6, 2.7 y 3.3 y versiones posteriores. El código fuente de Cython que Cython compila (a C) puede usar sintaxis de Python 2 y Python 3, y usa la sintaxis de Python 2 de manera predeterminada en Cython 0.x y la sintaxis de Python 3 en Cython 3.x. La sintaxis predeterminada se puede anular (por ejemplo, en un comentario del código fuente) con la sintaxis de Python 3 (o 2). Dado que la sintaxis de Python 3 ha cambiado en versiones recientes, es posible que Cython no esté actualizado con las últimas incorporaciones. Cython tiene "soporte nativo para la mayor parte del lenguaje C++" y "compila casi todo el código Python existente". [7]
Cython 3.0.0 se lanzó el 17 de julio de 2023. [8]
Cython funciona mediante la producción de un módulo Python estándar. Sin embargo, el comportamiento difiere del Python estándar en que el código del módulo, escrito originalmente en Python, se traduce a C. Si bien el código resultante es rápido, realiza muchas llamadas al intérprete de CPython y a las bibliotecas estándar de CPython para realizar el trabajo real. La elección de esta disposición ahorró considerablemente el tiempo de desarrollo de Cython, pero los módulos dependen del intérprete de Python y de la biblioteca estándar.
Aunque la mayor parte del código está basado en C, normalmente se requiere un pequeño cargador de código auxiliar escrito en Python interpretado (a menos que el objetivo sea crear un cargador escrito completamente en C, lo que puede implicar trabajar con los componentes internos no documentados de CPython). Sin embargo, esto no es un problema importante debido a la presencia del intérprete de Python. [9]
Cython tiene una interfaz de función externa para invocar rutinas C / C++ y la capacidad de declarar el tipo estático de parámetros y resultados de subrutinas, variables locales y atributos de clase.
Un programa Cython que implementa el mismo algoritmo que un programa Python correspondiente puede consumir menos recursos computacionales, como memoria central y ciclos de procesamiento, debido a las diferencias entre los modelos de ejecución CPython y Cython. Un programa Python básico se carga y ejecuta mediante la máquina virtual CPython , por lo que tanto el entorno de ejecución como el programa en sí consumen recursos computacionales. Un programa Cython se compila en código C, que a su vez se compila en código de máquina, por lo que la máquina virtual se usa solo brevemente cuando se carga el programa. [10] [11] [12] [13]
Cython emplea:
El rendimiento depende tanto del código C generado por Cython como de cómo el compilador de C compila ese código. [16]
Cython es un derivado del lenguaje Pyrex , pero soporta más características y optimizaciones que Pyrex. [17] [18] Cython fue una bifurcación de Pyrex en 2007 por los desarrolladores del paquete de álgebra computacional Sage , porque no estaban contentos con las limitaciones de Pyrex y no podían conseguir parches aceptados por el mantenedor de Pyrex, Greg Ewing, quien imaginó un alcance mucho menor para su herramienta de lo que los desarrolladores de Sage tenían en mente. Luego bifurcaron Pyrex como SageX. Cuando descubrieron que la gente estaba descargando Sage solo para obtener SageX, y los desarrolladores de otros paquetes (incluido Stefan Behnel, que mantiene la biblioteca XML LXML) también estaban manteniendo bifurcaciones de Pyrex, SageX se separó del proyecto Sage y se fusionó con cython-lxml
para convertirse en Cython. [19]
Los archivos Cython tienen una .pyx
extensión. En su forma más básica, el código Cython se parece exactamente al código Python. Sin embargo, mientras que el Python estándar tiene tipos dinámicos , en Cython se pueden proporcionar tipos de forma opcional, lo que permite un mejor rendimiento y permite convertir los bucles en bucles C cuando sea posible. Por ejemplo:
# El argumento se convertirá a int o generará un TypeError. def primes ( int kmax ): # Estas variables se declaran con tipos C. cdef int n , k , i # Otro tipo C cdef int p [1000] # Un resultado de tipo Python = [] si kmax > 1000 : kmax = 1000 k = 0 n = 2 mientras k < kmax : i = 0 mientras i < k y n % p [ i ] != 0 : i = i + 1 si i == k : p [ k ] = n k = k + 1 resultado .append ( n ) n = n + 1 devolver resultado
Un programa de ejemplo de Hola mundo para Cython es más complejo que en la mayoría de los lenguajes porque interactúa con la API de Python C u setuptools
otras facilidades de creación de extensiones compatibles con PEP517. [ jerga ] Se requieren al menos tres archivos para un proyecto básico:
setup.py
archivo para invocar el setuptools
proceso de compilación que genera el módulo de extensiónLos siguientes listados de códigos demuestran el proceso de compilación y lanzamiento:
# hello.pyx - Módulo Python, este código será traducido a C por Cython. def say_hello (): print ( "Hola mundo!" )
# launch.py - Cargador de código auxiliar de Python, carga el módulo creado por Cython.# Este código siempre se interpreta, como Python normal. # No se compila a C.importar hola hola .say_hello ( )
# setup.py - innecesario si no se redistribuye el código, ver más abajo from setuptools import setup from Cython.Build import cythonizeconfiguración ( nombre = "Aplicación Hola mundo" , módulos_ext = cythonize ( "*.pyx" ))
Estos comandos construyen y ejecutan el programa:
Configuración de Python.py build_ext --inplace $ lanzamiento de python.py
Una forma más sencilla de comenzar con Cython es a través de la línea de comandos IPython (o mediante la consola de Python en el navegador llamada Jupyter notebook ):
En [ 1 ]: % load_ext CythonEn [ 2 ]: %% cython ... : def f ( n ): ... : a = 0 ... : para i en rango ( n ): ... : a += i ... : devuelve a ... : ... : cpdef g ( int n ): ... : cdef long a = 0 ... : cdef int i ... : para i en rango ( n ): ... : a += i ... : devuelve a ... : En [ 3 ]: % timeit f ( 1000000 ) 10 bucles , el mejor de 3 : 26,5 ms por bucleEn [ 4 ]: % timeit g ( 1000000 ) 1000 bucles , el mejor de 3 : 279 µ s por bucle
lo que supone una mejora de 95 veces con respecto a la versión puramente Python. Más detalles sobre el tema en la página de inicio rápido oficial. [20]
Cython es particularmente popular entre los usuarios científicos de Python, [12] [21] [22] donde tiene "la audiencia perfecta" según el creador de Python, Guido van Rossum . [23] De particular interés:
El dominio de Cython no se limita únicamente a la computación numérica. Por ejemplo, el kit de herramientas XML lxml está escrito principalmente en Cython y, al igual que su predecesor Pyrex, Cython se utiliza para proporcionar enlaces Python para muchas bibliotecas de C y C++, como la biblioteca de mensajería ZeroMQ . [28] Cython también se puede utilizar para desarrollar programas paralelos para máquinas con procesadores multinúcleo ; esta característica hace uso de la biblioteca OpenMP .
python-dev
{{cite web}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )python-dev
{{cite book}}
: |journal=
ignorado ( ayuda )