Cython es un lenguaje de programación que pretende ser un superconjunto del lenguaje de programación Python , diseñado para brindar un rendimiento similar al de C con código que está escrito principalmente en Python con sintaxis adicional opcional inspirada en C. [4] [5]
Desarrollador (es) | Robert Bradshaw, Stefan Behnel y col. |
---|---|
Versión inicial | 28 de julio de 2007 [1] |
Lanzamiento estable | 0.29.21 (8 de julio de 2020 [±] [2] | )
Versión de vista previa | 3.0a6 (31 de julio de 2020 [3] ) [±] |
Repositorio | |
Escrito en | Python , C |
Tipo | Lenguaje de programación |
Licencia | Licencia Apache 2.0 |
Sitio web | cython |
Cython es un lenguaje compilado que se usa normalmente para generar módulos de extensión CPython . El código anotado similar a Python se compila en C o C ++ y luego se envuelve automáticamente en el código de interfaz , produciendo módulos de extensión que pueden ser cargados y usados por código Python regular usando la declaración de importación, pero con una sobrecarga computacional significativamente menor en tiempo de ejecución . Cython también facilita el empaquetado 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 compatibles con CPython 2.6, 2.7 y 3.3 y versiones posteriores.
Cython 3.0.0 está en desarrollo. [6]
Diseño
Cython funciona produciendo un módulo Python estándar. Sin embargo, el comportamiento difiere del Python estándar en que el código del módulo, originalmente escrito 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, generalmente 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, este no es un problema importante debido a la presencia del intérprete de Python. [7]
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 subrutina, variables locales y atributos de clase.
Un programa Cython que implementa el mismo algoritmo que un programa Python correspondiente puede consumir menos recursos informáticos, como la memoria central y los ciclos de procesamiento, debido a las diferencias entre los modelos de ejecución CPython y Cython. La máquina virtual CPython carga y ejecuta un programa básico de Python , por lo que tanto el tiempo de ejecución como el programa consumen recursos informáticos. Un programa Cython se compila en código C, que luego se compila en código de máquina, por lo que la máquina virtual se usa solo brevemente cuando se carga el programa. [8] [9] [10] [11]
Cython emplea:
- Optimizaciones optimistas
- Inferencia de tipo (opcional)
- Baja sobrecarga en estructuras de control
- Baja sobrecarga de llamadas de función [12] [13]
El rendimiento depende tanto del código C generado por Cython como de cómo el compilador C compila ese código. [14]
Historia
Cython es un derivado del lenguaje Pyrex y admite más funciones y optimizaciones que Pyrex. [15] [16] Cython fue bifurcado de Pyrex en 2007 por los desarrolladores del paquete de álgebra informática Sage , porque no estaban contentos con las limitaciones de Pyrex y no pudieron conseguir que los parches fueran aceptados por el mantenedor de Pyrex, Greg Ewing, quien imaginó un alcance mucho menor para su herramienta. 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. [17]
Los archivos Cython tienen una .pyx
extensión. En su forma más básica, el código Cython se ve exactamente como el código Python. Sin embargo, mientras que Python estándar se escribe dinámicamente , en Cython, los tipos se pueden proporcionar opcionalmente, lo que permite un rendimiento mejorado, permitiendo que los bucles se conviertan en bucles C siempre que sea posible. Por ejemplo:
def primes ( int kmax ): # El argumento se convertirá a int o generará un TypeError. cdef int n , k , i # Estas variables se declaran con tipos C. cdef int p [1000] # Otro resultado de tipo C = [] # Un tipo de Python si kmax > 1000 : kmax = 1000 k = 0 n = 2 while k < kmax : i = 0 while i < k y n % p [ i ] ! = 0 : i = i + 1 si i == k : p [ k ] = n k = k + 1 resultado . añadir ( n ) n = n + 1 devolver resultado
Ejemplo
Un programa hello world de muestra para Cython es más complejo que en la mayoría de los lenguajes porque interactúa con la API de Python C y la función de setuptools
creación de extensiones. Se requieren al menos tres archivos para un proyecto básico:
- Un
setup.py
archivo para invocar elsetuptools
proceso de construcción que genera el módulo de extensión. - Un programa principal de Python para cargar el módulo de extensión.
- Archivo (s) fuente de Cython
Los siguientes listados de código demuestran el proceso de creación y ejecución:
# hello.pyx - Módulo de Python, este código será traducido a C por Cython. def say_hello (): print ( "¡Hola mundo!" )
# launch.py: cargador de stub de Python, carga el módulo creado por Cython.# Este código siempre se interpreta, como Python normal. # No está compilado para C.import hola hola . say_hello ()
# Setup.py - innecesario si no redistribuir el código, véase más abajo de setuptools importación de configuración de Cython.Build importación cythonizeconfiguración ( nombre = " Aplicación Hola mundo" , ext_modules = cythonize ( "* .pyx" ))
Estos comandos crean y ejecutan el programa:
$ python setup.py build_ext --inplace$ python launch.py
Utilizando en el cuaderno IPython / Jupyter
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 ... : for i in range ( n ): ... : a + = i ... : return a ... : ... : cpdef g ( int n ): ... : cdef long a = 0 ... : cdef int i ... : for i in range ( n ): ... : a + = i ... : return a ... : En [ 3 ]: % timeit f ( 1000000 ) 10 bucles , lo mejor de 3 : 26,5 ms por bucleEn [ 4 ]: % timeit g ( 1000000 ) 1000 bucles , lo mejor de 3 : 279 µ s por bucle
lo que ofrece una mejora de 95 veces con respecto a la versión de python puro. Más detalles sobre el tema en la página oficial de inicio rápido. [18]
Usos
Cython es particularmente popular entre los usuarios científicos de Python, [10] [19] [20] donde tiene "la audiencia perfecta" según el creador de Python, Guido van Rossum . [21] De particular interés:
- El sistema de álgebra computacional de software gratuito SageMath depende de Cython, tanto para el rendimiento como para interactuar con otras bibliotecas. [22]
- Partes importantes de las bibliotecas informáticas científicas SciPy , pandas y scikit-learn están escritas en Cython. [23] [24]
- Algunos sitios web de alto tráfico como Quora usan Cython. [se necesita una mejor fuente ] [25]
El dominio de Cython no se limita 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 de Python para muchas bibliotecas C y C ++, como la biblioteca de mensajería ZeroMQ . [26] Cython también se puede utilizar para desarrollar programas paralelos para máquinas con procesador de múltiples núcleos ; esta característica hace uso de la biblioteca OpenMP .
Ver también
- PyPy
- Numba
Referencias
- ^ Behnel, Stefan (2008). "El compilador Cython para extensiones C en Python" . EuroPython (28 de julio de 2007: lanzamiento oficial de Cython). Vilnius / Lietuva.
- ^ "Lanzamientos - cython / cython" . Consultado el 16 de octubre de 2020 , a través de GitHub .
- ^ "cython / cython" . GitHub . Consultado el 7 de octubre de 2020 .
- ^ "Cython - una descripción general - documentación de Cython 0.19.1" . Docs.cython.org . Consultado el 21 de julio de 2013 .
- ^ Smith, Kurt (2015). Cython: una guía para programadores de Python . O'Reilly Media. ISBN 978-1-4919-0155-7.
- ^ "Soporta identificadores Unicode · Problema # 2601 · cython / cython" . GitHub . Consultado el 11 de octubre de 2019 .
- ^ "Tutorial básico - documentación de Cython 3.0a6" . cython.readthedocs.io . Consultado el 11 de diciembre de 2020 .
- ^ Oliphant, Travis (20 de junio de 2011). "Descubrimiento técnico: acelerar Python (NumPy, Cython y Weave)" . Technicaldiscovery.blogspot.com . Consultado el 21 de julio de 2013 .
- ^ Behnel, Stefan; Bradshaw, Robert; Citro, Craig; Dalcin, Lisandro; Seljebotn, Dag Sverre; Smith, Kurt (2011). "Cython: lo mejor de ambos mundos" . Computación en Ciencias e Ingeniería . 13 (2): 31–39. Código bibliográfico : 2011CSE .... 13b..31B . doi : 10.1109 / MCSE.2010.118 . S2CID 14292107 .
- ^ a b Seljebot, Dag Sverre (2009). "Cálculos numéricos rápidos con Cython" . Actas de la octava conferencia Python in Science (SciPy 2009) : 15-22.
- ^ Wilbers, I .; Langtangen, HP; Ødegård, Å. (2009). B. Skallerud; HI Andersson (eds.). "Uso de Cython para acelerar los programas numéricos de Python" (PDF) . Actas de MekIT'09 : 495–512 . Consultado el 14 de junio de 2011 .
- ^ "Puntos de referencia de envoltura para varios generadores de envoltura de Python (excepto Cython)" . Archivado desde el original el 4 de abril de 2015 . Consultado el 28 de mayo de 2010 .
- ^ "pruebas de rendimiento de envoltura para Cython, Boost.Python y PyBindGen" . Archivado desde el original el 3 de marzo de 2016 . Consultado el 28 de mayo de 2010 .
- ^ "Cython: Extensiones C para Python" . Consultado el 22 de noviembre de 2015 .
- ^ "Diferencias entre Cython y Pyrex" .
- ^ Ewing, Greg (21 de marzo de 2011). "Re: Información de la cumbre de VM y lenguaje para aquellos que no están en Pycon (¡y aquellos que sí!)" (Mensaje a la lista de correo electrónico python-dev ) . Consultado el 5 de mayo de 2011 .
- ^ Dice el desarrollador de Sage y Cython, Robert Bradshaw, en la conferencia Sage Days 29 (22 de marzo de 2011). "Cython: pasado, presente y futuro" . youtube.com . Consultado el 5 de mayo de 2011 .
- ^ "Construyendo código Cython" . cython.readthedocs.io . Consultado el 24 de abril de 2017 .
- ^ "inSCIght: The Scientific Computing Podcast" (episodio 6). Archivado desde el original el 10 de octubre de 2014 . Consultado el 29 de mayo de 2011 .
- ^ Millman, Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros" . Computación en Ciencias e Ingeniería . 13 (2): 9-12. Código bibliográfico : 2011CSE .... 13b ... 9M . doi : 10.1109 / MCSE.2011.36 .
- ^ Guido Van Rossum (21 de marzo de 2011). "Re: Información de la cumbre de VM y lenguaje para aquellos que no están en Pycon (¡y aquellos que sí!)" (Mensaje a la lista de correo electrónico python-dev ) . Consultado el 5 de mayo de 2011 .
- ^ Erocal, Burcin; Stein, William (2010). The Sage Project: Unificando software matemático gratuito para crear una alternativa viable a Magma, Maple, Mathematica y MATLAB (PDF) . Software matemático 'ICMS 2010 . Apuntes de conferencias en Ciencias de la Computación. 6327 . Springer Berlín / Heidelberg. págs. 12-27. CiteSeerX 10.1.1.172.624 . doi : 10.1007 / 978-3-642-15582-6_4 . ISBN 978-3-642-15581-9.
- ^ "Notas de la versión SciPy 0.7.2" .
- ^ Pedregosa, Fabián; Varoquaux, Gaël; Gramfort, Alexandre; Michel, Vincent; Thirion, Bertrand; Grisel, Olivier; Blondel, Mathieu; Prettenhofer, Peter; Weiss, Ron; Dubourg, Vincent; Vanderplas, Jake; Passos, Alexandre; Cournapeau, David (2011). "Scikit-learn: Machine Learning en Python". Revista de investigación sobre aprendizaje automático . 12 : 2825-2830. arXiv : 1201.0490 .
- ^ "¿Quora todavía se está ejecutando en PyPy?" .
- ^ "ØMQ: enlace de Python" .
enlaces externos
- Página web oficial
- Cython en GitHub