Articulo de referencia

Cython

{{cite web |url=https://www.behnel.de/cythonEP2008/cython-ep2008.html |type=28 July 2007: official Cython launch |title=The Cython Compiler for C-Extensions in Python |last=Behn...

Cython ( / ˈ s θ ɒ 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 habitualmente para generar módulos de extensión de CPython . El código anotado, similar a Python, se compila a C y luego se encapsula automáticamente en código de interfaz , produciendo módulos de extensión que pueden ser cargados y utilizados por código Python estándar mediante la instrucción `import`, pero con una sobrecarga computacional significativamente menor en tiempo de ejecución . Cython también facilita la encapsulación 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 , generando archivos fuente en C compatibles con CPython 2.6, 2.7, 3.3 y versiones posteriores. El código fuente que Cython compila (a C) puede usar la sintaxis de Python 2 y Python 3, con la sintaxis de Python 2 por defecto en Cython 0.x y la de Python 3 en Cython 3.x. Esta configuración predeterminada se puede modificar (por ejemplo, mediante un comentario en el código fuente) para usar 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 novedades. Cython ofrece "compatibilidad nativa con 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 ]

Diseño

Cython funciona mediante la generación de un módulo Python estándar. Sin embargo, su comportamiento difiere del de Python estándar, ya 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 numerosas llamadas al intérprete y a las bibliotecas estándar de CPython para llevar a cabo el trabajo. Esta configuración permitió ahorrar considerablemente tiempo en el desarrollo de Cython, pero los módulos dependen del intérprete y la biblioteca estándar de Python.

Aunque la mayor parte del código está basado en C, normalmente se requiere un pequeño cargador auxiliar escrito en Python interpretado (a menos que el objetivo sea crear un cargador escrito completamente en C, lo que podría implicar trabajar con los detalles internos no documentados de CPython). Sin embargo, esto no representa un problema importante debido a la presencia del intérprete de Python. [ 9 ]

Cython dispone de una interfaz de funciones externas para invocar rutinas de C / C++ y la capacidad de declarar el tipo estático de los parámetros y resultados de las subrutinas, las variables locales y los atributos de clase.

Un programa Cython que implementa el mismo algoritmo que un programa Python correspondiente puede consumir menos recursos computacionales, como memoria principal y ciclos de procesamiento, debido a las diferencias entre los modelos de ejecución de 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 a código C, que a su vez se compila a código máquina, por lo que la máquina virtual se utiliza solo brevemente cuando se carga el programa. [ 10 ] [ 11 ] [ 12 ] [ 13 ]

Cython emplea:

  • Optimizaciones optimistas
  • Inferencia de tipo (opcional)
  • Bajos costos generales en las estructuras de control
  • Baja sobrecarga de llamadas a funciones [ 14 ] [ 15 ]

El rendimiento depende tanto del código C generado por Cython como de cómo lo compila el compilador de C. [ 16 ]

Historia

Cython es un derivado del lenguaje Pyrex , pero admite más características y optimizaciones que Pyrex. [ 17 ] [ 18 ] Cython fue bifurcado de Pyrex en 2007 por los desarrolladores del paquete de álgebra computacional Sage , porque no estaban satisfechos con las limitaciones de Pyrex y no pudieron lograr que el mantenedor de Pyrex, Greg Ewing, aceptara sus parches, ya que él imaginaba un alcance mucho menor para su herramienta que el que tenían en mente los desarrolladores de Sage. Entonces bifurcaron Pyrex como SageX. Cuando descubrieron que la gente descargaba Sage solo para obtener SageX, y que los desarrolladores de otros paquetes (incluido Stefan Behnel, quien mantiene la biblioteca XML LXML ) también mantenían bifurcaciones de Pyrex, SageX se separó del proyecto Sage y se fusionó con cython-lxmlpara convertirse en Cython. [ 19 ]

Los archivos Cython tienen una .pyxextensión. En su forma más básica, el código Cython se ve exactamente igual que el código Python. Sin embargo, mientras que Python estándar es de tipado dinámico , en Cython se pueden proporcionar tipos opcionalmente, lo que permite un mejor rendimiento y la conversión de bucles a 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 = 1000k = 0 n = 2mientras k < kmax : i = 0mientras i < k y n % p [ i ] != 0 : i = i + 1Si i == k : p [ k ] = n k = k + 1 resultado.append ( n )n = n + 1devolver resultado

Ejemplos

Hola Mundo en Cython

Un programa de ejemplo "hola mundo" para Cython es más complejo que en la mayoría de los lenguajes porque interactúa con la API de C de Python y setuptools/o con otras herramientas de creación de extensiones compatibles con PEP517 . Se requieren al menos tres archivos para un proyecto básico:

  • Un setup.pyarchivo para invocar el setuptoolsproceso de compilación que genera el módulo de extensión.
  • Un programa principal en Python para cargar el módulo de extensión.
  • Archivo(s) fuente de Cython

Los siguientes listados de código demuestran el proceso de compilación y lanzamiento:

# hello.pyx - Módulo de Python, este código será traducido a C por Cython. def say_hello (): print ( "Hello World!" )
# launch.py ​​- Cargador de stub de Python, carga el módulo que fue creado por Cython.# Este código siempre se interpreta, como Python normal. # No se compila a C.import hello hello.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" , ext_modules = cythonize ( "*.pyx" ))

Estos comandos compilan y ejecutan el programa:

$ python setup.py build_ext --inplace $ python launch.py 

Uso en IPython/Jupyter Notebook

Una forma más sencilla de empezar con Cython es a través de la línea de comandos de IPython (o a través de 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 ... : devolver a ... : ... : cpdef g ( int n ): ... : cdef long a = 0 ... : cdef int i ... : para i en rango ( n ): ... : a += i ... : devolver a ... :En [ 3 ]: % timeit f ( 1000000 ) 10 bucles , mejor de 3 : 26,5 ms por bucleEn [ 4 ]: % timeit g ( 1000000 ) 1000 bucles , mejor de 3 : 279 µ s por bucle

lo que supone una mejora de 95 veces respecto a la versión escrita completamente en Python. Encontrará más detalles sobre el tema en la página de inicio rápido oficial. [ 20 ]

Usos de Cython

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 ] Cabe destacar:

El ámbito de Cython no se limita únicamente a la computación numérica. Por ejemplo, el kit de herramientas XML lxml está escrito mayoritariamente en Cython, y al igual que su predecesor Pyrex, Cython se utiliza para proporcionar enlaces de Python para muchas bibliotecas de C y C++, como la biblioteca de mensajería ZeroMQ . [ 27 ] Cython también puede utilizarse para desarrollar programas paralelos para máquinas con procesadores multinúcleo ; esta función utiliza la biblioteca OpenMP .

Véase también

Referencias

  1. Behnel, Stefan (2008). "El compilador Cython para extensiones C en Python" . EuroPython (28 de julio de 2007: lanzamiento oficial de Cython). Vilna/Lituania.
  2. "Versión 3.2.3-1" . 14 de diciembre de 2025. Consultado el 15 de diciembre de 2025 .
  3. Registro de cambios de Cython , cython, 15 de mayo de 2023 , consultado el 19 de mayo de 2023
  4. "Conceptos básicos del lenguaje: documentación de Cython 3.0.0a9" . cython.readthedocs.io . Consultado el 9 de septiembre de 2021 .
  5. "Cython - una descripción general — Documentación de Cython 0.19.1" . Docs.cython.org . Consultado el 21 de julio de 2013 .
  6. Smith, Kurt (2015). Cython: Una guía para programadores de Python . O'Reilly Media . ISBN 978-1-4919-0155-7.
  7. "Preguntas frecuentes · cython/cython Wiki" . GitHub . Consultado el 11 de enero de 2023 .
  8. "Registro de cambios de Cython" . cython.org . Consultado el 21 de julio de 2023 .
  9. "Tutorial básico: documentación de Cython 3.0a6" . cython.readthedocs.io . Consultado el 11 de diciembre de 2020 .
  10. Oliphant, Travis (20 de junio de 2011). "Technical Discovery: Speeding up Python (NumPy, Cython y Weave)" . Technicaldiscovery.blogspot.com . Recuperado el 21 de julio de 2013 .
  11. Behnel, Stefan; Bradshaw, Robert; Citro, Craig; Dalcin, Lisandro; Seljebotn, Dag Sverre; Smith, Kurt (2011). "Cython: Lo mejor de ambos mundos" . Computing in Science and Engineering . 13 (2): 31– 39. Bibcode : 2011CSE....13b..31B . doi : 10.1109/MCSE.2010.118 . hdl : 11336/13103 . S2CID 14292107 . 
  12. 1 2 Seljebot, Dag Sverre (2009). "Cálculos numéricos rápidos con Cython" . Actas de la 8.ª Conferencia Python en la Ciencia . págs. 15–22 . doi : 10.25080/GTCA8577 . 
  13. Wilbers, I.; Langtangen, HP; Ødegård, Å. (2009). Skallerud, B.; Andersson, HI (eds.). "Using Cython to Speed ​​up Numerical Python Programs" . Actas de MekIT'09 : 495–512 . Archivado del original (PDF) el 4 de enero de 2017. Recuperado el 14 de junio de 2011 .
  14. "Pruebas comparativas de rendimiento para varios generadores de envolturas de Python (excepto Cython)" . Archivado del original el 4 de abril de 2015. Consultado el 28 de mayo de 2010 .
  15. "Pruebas comparativas de wrappers para Cython, Boost.Python y PyBindGen" . Archivado del original el 3 de marzo de 2016. Consultado el 28 de mayo de 2010 .
  16. "Cython: Extensiones de C para Python" . Consultado el 22 de noviembre de 2015 .
  17. "Diferencias entre Cython y Pyrex" . GitHub .
  18. Ewing, Greg (21 de marzo de 2011). "Re: Información sobre la cumbre de máquinas virtuales y lenguajes para quienes no están en Pycon (¡y para quienes sí lo están!)" (Mensaje a la lista de correo electrónico ) . Recuperado el 5 de mayo de 2011 .python-dev
  19. Lo dice Robert Bradshaw, desarrollador de Sage y Cython, en la conferencia Sage Days 29 (22 de marzo de 2011). "Cython: pasado, presente y futuro" . Archivado del original el 21 de diciembre de 2021. Recuperado el 5 de mayo de 2011 a través de YouTube .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  20. "Creación de código Cython" . cython.readthedocs.io . Consultado el 24 de abril de 2017 .
  21. "inSCIght: El podcast de computación científica" (Episodio 6). Archivado del original el 10 de octubre de 2014. Recuperado el 29 de mayo de 2011 .
  22. Millman, Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros" . Computing in Science and Engineering . 13 (2): 9– 12. Bibcode : 2011CSE....13b...9M . doi : 10.1109/MCSE.2011.36 .
  23. Guido Van Rossum (21 de marzo de 2011). "Re: Información sobre la cumbre de máquinas virtuales y lenguajes para quienes no están en Pycon (¡y para quienes sí lo están!)" (Mensaje a la lista de correo electrónico ) . Consultado el 5 de mayo de 2011 .python-dev
  24. Erocal, Burcin; Stein, William (2010). «The Sage Project: Unifying Free Mathematical Software to Create a Viable Alternative to Magma, Maple, Mathematica and MATLAB». Mathematical Software – ICMS 2010 (PDF) . Lecture Notes in Computer Science. Vol. 6327. Springer Berlin / Heidelberg. pp. 12–27 . CiteSeerX 10.1.1.172.624 . doi : 10.1007/978-3-642-15582-6_4 . ISBN    978-3-642-15581-9.
  25. "Notas de la versión 0.7.2 de SciPy" . Archivado del original el 4 de marzo de 2016. Consultado el 29 de mayo de 2011 .
  26. Pedregosa, Fabián; Varoquaux, Gaël; Grafort, Alexandre; Michel, Vicente; Thirion, Bertrand; Grisel, Olivier; Blondel, Mathieu; Prettenhofer, Peter; Weiss, Ron; Dubourg, Vicente; Vanderplas, Jake; Passos, Alejandro; Cournapeau, David (2011). "Scikit-learn: aprendizaje automático en Python". Revista de investigación sobre aprendizaje automático . 12 : 2825–2830 . arXiv : 1201.0490 . Código Bib : 2011JMLR...12.2825P .
  27. "ØMQ: Enlace Python" .
  • Sitio web oficialEdita esto en Wikidata
  • Cython en GitHub