stringtranslate.com

Citón

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 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]

Diseño

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]

Historia

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-lxmlpara convertirse en Cython. [19]

Los archivos Cython tienen una .pyxextensió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

Ejemplo

Hola mundo en Cython

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 setuptoolsotras facilidades de creación de extensiones compatibles con PEP517. [ jerga ] Se requieren al menos tres archivos para un proyecto básico:

Los 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 

Uso 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  ... :  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]

Usos

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 .

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). Vilnius/Lietuva.
  2. ^ "Versión 3.0.11-1". 5 de agosto de 2024. Consultado el 22 de agosto de 2024 .
  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, and Weave)» (Descubrimiento técnico: acelerar Python (NumPy, Cython y Weave)). Technicaldiscovery.blogspot.com . Consultado 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". Computación en ciencia e ingeniería . 13 (2): 31–39. Bibcode :2011CSE....13b..31B. doi :10.1109/MCSE.2010.118. hdl : 11336/13103 . S2CID  14292107.
  12. ^ ab Seljebot, Dag Sverre (2009). "Cálculos numéricos rápidos con Cython". Actas de la 8.ª Conferencia sobre Python en la Ciencia (SciPy 2009) : 15–22.
  13. ^ Wilbers, I.; Langtangen, HP; Ødegård, Å. (2009). Skallerud, B.; Andersson, HI (eds.). "Uso de Cython para acelerar programas numéricos en Python". Actas de MekIT'09 : 495–512. Archivado desde el original (PDF) el 4 de enero de 2017. Consultado el 14 de junio de 2011 .
  14. ^ "Puntos de referencia de wrappers para varios generadores de wrappers de Python (excepto Cython)". Archivado desde el original el 4 de abril de 2015 . Consultado el 28 de mayo de 2010 .
  15. ^ "Puntos de referencia de wrapper para Cython, Boost.Python y PyBindGen". Archivado desde el original el 3 de marzo de 2016 . Consultado el 28 de mayo de 2010 .
  16. ^ "Cython: extensiones 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 VM y lenguaje para quienes no asisten a Pycon (¡y para quienes sí!)" (Mensaje a la lista de correo electrónico ) . Consultado el 5 de mayo de 2011 .python-dev
  19. ^ Lo 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». Archivado desde el original el 21 de diciembre de 2021. Consultado el 5 de mayo de 2011 – vía 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: The Scientific Computing Podcast" (Episodio 6). Archivado desde el original el 10 de octubre de 2014. Consultado el 29 de mayo de 2011 .
  22. ^ Millman, Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros". Computación en ciencia e ingeniería . 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 VM y lenguaje para quienes no asisten a Pycon (¡y para quienes sí!)" (Mensaje a la lista de correo electrónico ) . Consultado el 5 de mayo de 2011 .python-dev
  24. ^ Erocal, Burcin; Stein, William (2010). "El proyecto Sage: unificación del software matemático libre para crear una alternativa viable a Magma, Maple, Mathematica y MATLAB". Software matemático – ICMS 2010 (PDF) . Apuntes de clase en informática. Vol. 6327. Springer Berlin / 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. {{cite book}}: |journal=ignorado ( ayuda )
  25. ^ "Notas de la versión de SciPy 0.7.2". Archivado desde el original el 4 de marzo de 2016 . Consultado el 29 de mayo de 2011 .
  26. ^ Pedregosa, Fabian; 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: aprendizaje automático en Python". Revista de investigación en aprendizaje automático . 12 : 2825–2830. arXiv : 1201.0490 . Código Bibliográfico :2011JMLR...12.2825P.
  27. ^ "¿Quora todavía funciona con PyPy?"
  28. ^ "ØMQ: Enlace de Python".

Enlaces externos