Cython

Cython
Cython-logo.svg
Datos básicos
Paradigmas : multiparadigmático
Año de publicación: 28 de julio de 2007
Desarrollador: Robert Bradshaw, Stefan Behnel y col.
Versión actual  0.29.21   (8 de julio de 2020)
Escribiendo : fuerte , estático , dinámico (" tipeo de pato ")
Influenciado por: Python , C , C ++
Sistema operativo : Linux , sistema similar a Unix
Licencia : Licencia Apache, versión 2.0, licencia Apache
cython.org

Cython es un lenguaje de programación universal que es ampliamente compatible con Python . Al igual que estos, admite varios paradigmas de programación , como la programación orientada a objetos , orientada a aspectos y funcional . Sin embargo, la principal ventaja radica en la traducción al lenguaje de destino C, que permite un alto rendimiento en comparación con el intérprete estándar de Python y la interacción directa con código externo escrito en C, C ++ o Fortran .

Las principales aplicaciones son la conexión de externos bibliotecas a la CPython - intérprete , así como la aceleración de código Python. El compilador Cython también se puede utilizar para compilar módulos Python puros.

El código generado no es autosuficiente, pero requiere un entorno de ejecución compatible con CPython . Tanto la generación de módulos binarios ("módulo de extensión"), que se pueden importcargar dinámicamente en el intérprete de Python a través del comando, como la integración del enlazador del intérprete de CPython en el módulo generado, de modo que un ejecutable Se crea el programa ( incrustación ).

Historia de desarrollo

Cython está basado en Pyrex por Greg Ewing (publicado por primera vez el 4 de abril de 2002). En julio de 2007, el compilador Cython se separó de Pyrex como un proyecto independiente desarrollado abiertamente por Robert Bradshaw y Stefan Behnel. Desde entonces, se han hecho intentos para mantener los dos compiladores en gran parte compatibles, aunque Cython utiliza optimizaciones de gran alcance y logra una mayor compatibilidad con el código Python. Las diferencias importantes con Pyrex se describen en la documentación de Cython.

Origen del nombre

El nombre Cython es una palabra maleta de los dos lenguajes de programación subyacentes: Python y C.

objetivos

El proyecto Cython se ha fijado el objetivo de desarrollar un compilador para código Python normal que ofrezca el mayor rendimiento posible y una amplia integración con el código escrito en C, C ++ y Fortran mediante escritura estática adicional (explícita).

Cython es un compilador optimizador, pero no en el sentido habitual de un compilador que genera código binario . Más bien, la traducción al código C permite que muchas optimizaciones fundamentales y ajustes de plataforma se dejen a un compilador de C. El compilador Cython puede, por tanto, limitarse a optimizaciones de alto nivel en el nivel AST .

El código C que genera Cython es en gran parte portátil en términos de plataformas (procesador, compilador C y sistema operativo) y versiones de CPython. Actualmente (versión 0.28.5) se admiten las versiones 2.6 y 2.7 de CPython, así como todas las versiones 3.3 en adelante. Las plataformas probadas incluyen macOS , Windows y, sobre todo, varias distribuciones de Linux con versiones de sistema de 32 y 64 bits .

caracteristicas

La combinación de Python y C permite a Cython mapear una amplia gama de requisitos. Es posible la programación de alto nivel con tipos de datos Python, construcciones de lenguaje y administración automática de memoria, así como la programación muy cercana a C con tipos de datos C, funciones C y administración manual de memoria. Ambos se pueden combinar como se desee y la interacción con código Python puro (no compilado) es tan nativamente posible como la interacción con código C o C ++, lo que permite un enfoque muy detallado al optimizar el código Cython. Cualquier parte del código puede escribirse en Python puro, compilarse con Cython, optimizarse con tipos de datos estáticos o incluso trasladarse a C, según los requisitos. De esta manera, Cython apoya el principio de que la mayor parte del tiempo de ejecución de un programa se crea en una parte muy pequeña del código fuente , es decir, la optimización de una pequeña parte del programa puede traer una gran ganancia en el rendimiento, mientras que para la mayoría del código una alta velocidad de desarrollo y una Los requisitos de bajo mantenimiento son más importantes que la máxima velocidad de ejecución posible.

El lenguaje de programación logra la integración del lenguaje entre Python y C principalmente a través de tipos de datos. Se pueden aplicar diferentes construcciones del lenguaje Python tanto a los tipos de datos Python como a los tipos de datos C. Un ejemplo es el ciclo 'for', que es un ciclo foreach en Python, es decir, puede ejecutarse sobre cualquier contenedor iterable (por ejemplo, listas o archivos). En Cython, este bucle también se puede ejecutar sobre listas de C ++, matrices y submatrices de C, así como sobre secciones de puntero ( ptr[2:8]por ejemplo, para compensaciones 2-7). Además, hay una conversión automática entre diferentes tipos de datos de Python y tipos de datos C, tanto para tipos escalares (números) como para cadenas de caracteres y tipos de datos estructurados (por ejemplo, tipos de estructuras C y diccionarios de Python).

actuación

Muchas de las optimizaciones que realiza el compilador Cython dan como resultado automáticamente una especialización del código C generado. Para hacer esto, el compilador usa declaraciones explícitas de tipo estático e inferencia de tipo (simple) para generar código C especializado para los tipos de datos usados ​​y ciertos patrones de código. Una gran parte de las optimizaciones del compilador Cython se relacionan con los bucles, ya que una gran parte del tiempo de ejecución total suele acumularse aquí.

Las estructuras de control (especialmente los bucles) se traducen muchas veces más rápido con Cython y un compilador de C que cuando son interpretadas por CPython. Esto se debe a optimizaciones optimistas e inferencia de tipos. Esto significa que el código Python compilado por Cython generalmente se ejecuta más rápido que en CPython 2.6.x incluso sin declaraciones de tipo explícitas, aunque el rendimiento relativo depende naturalmente del código en cuestión. Sin embargo, a través de la declaración estática de tipos de datos y la especialización resultante del código C, generalmente es posible lograr una aceleración múltiple. Especialmente con los cálculos matemáticos, las mejoras en el tiempo de ejecución a menudo resultan en un factor de cien a mil. En comparación, la aceleración típica a través del compilador Python JIT Psyco es de cuatro a cien veces , con PyPy en casos seleccionados hasta doce veces.

El código generado por Cython para funciones está optimizado para un rápido desempaquetado y conversión de parámetros de llamada. Por lo tanto, llamar a código nativo a Python a través de un contenedor Cython es generalmente más rápido que otras implementaciones de contenedor de Python.

Áreas de aplicación

Las áreas de aplicación más importantes de Cython son la conexión de bibliotecas externas al intérprete CPython, así como la aceleración del código Python, especialmente en cálculos matemáticos y algoritmos computacionalmente intensivos .

Por ejemplo, el sistema de álgebra informática SageMath se basa en gran medida en el código Cython. Se utiliza tanto para la implementación de algoritmos matemáticos como para la conexión de códigos externos en C, C ++ y Fortran. Cython también admite una interacción muy eficiente con NumPy - matrices , que en base a estos cálculos se simplifica enormemente.

La biblioteca XML de alto rendimiento lxml se implementa en gran medida en Cython. Las bibliotecas externas de C libxml2 y libxslt están vinculadas al intérprete de Python.

Otro ejemplo del entorno de desarrollo Cython Core es la biblioteca MPI mpi4py. Conecta varias implementaciones de MPI a CPython.

En el índice de paquetes de Python hay una breve lista de otras bibliotecas que se implementan en Cython.

Proyectos relacionados y similares

  • Pyrex - predecesor de Cython
  • Unladen Swallow: entorno de ejecución CPython optimizado; basado en LLVM
  • PyPy : marco del compilador JIT y tiempo de ejecución de Python que está escrito en un dialecto de Python (RPython)
  • Psyco : optimizador de código y compilador JIT especializado para el entorno de ejecución CPython
  • Shed Skin: lenguaje de programación tipo Python de tipo estático que se compila de acuerdo con C ++

Evidencia individual

  1. Versión 0.29.21 . 8 de julio de 2020 (consultado el 9 de julio de 2020).
  2. github.com . (consultado el 2 de febrero de 2020).
  3. Cython: Extensiones C para Python . (consultado el 8 de julio de 2018).
  4. versiones originales del predecesor Pyrex
  5. compatibilidad con Python 2 es el objetivo declarado para el futuro Cython versión 1.0 ( Memento de la original, del 10 de agosto de 2011 en el Archivo de Internet ) Información: El archivo de enlace se inserta de forma automática y sin embargo no se comprueba. Verifique el enlace original y de archivo de acuerdo con las instrucciones y luego elimine este aviso. @ 1@ 2Plantilla: Webachiv / IABot / wiki.cython.org
  6. rodajas en docs.python.org, consultado el 2 de agosto de 2018
  7. gmane.comp.python.cython.devel - comparación de pybench de Cython y CPython 2.6.2
  8. gmane.comp.python.cython.devel - Pasar un puntero desde Python ( Memento de la original, del 14 de febrero, 2017 el Archivo de Internet ) Información: El archivo de enlace se inserta de forma automática y sin embargo no se comprueba. Verifique el enlace original y de archivo de acuerdo con las instrucciones y luego elimine este aviso. @ 1@ 2Plantilla: Webachiv / IABot / thread.gmane.org
  9. ^ Psyco - Introducción
  10. Velocidad de PyPy 1.4 en comparación con CPython 2.6.2 con / sin Psyco
  11. C ++ envoltorio puntos de referencia para diversos Python envoltorio generadores (sin Cython) ( Memento de la original, del 4 de abril, 2015 en el Archivo de Internet ) Información: El archivo de enlace se inserta de forma automática y sin embargo no se comprueba. Verifique el enlace original y de archivo de acuerdo con las instrucciones y luego elimine este aviso. @ 1@ 2Plantilla: Webachiv / IABot / telecom.inescporto.pt
  12. Puntos de referencia de contenedor de C ++ para Cython, Boost.Python y PyBindGen
  13. Lista de los paquetes de Python implementados en Cython en PyPI