python performance cython

python - Cython Speed Boost vs. Usabilidad



performance (7)

Acabo de encontrarme con Cython, mientras buscaba formas de optimizar el código de Python. Leí varias publicaciones en stackoverflow, la wiki de python y leí el artículo "Reglas generales para la optimización".

Cython es algo que capta mi interés más; en lugar de escribir C-code para usted, puede elegir tener otros tipos de datos en su código python.

Aquí hay una prueba tonta que probé

#!/usr/bin/python # test.pyx def test(value): for i in xrange(value): i**2 if(i==1000000): print i test(10000001)

$ tiempo python test.pyx

real 0m16.774s user 0m16.745s sys 0m0.024s

$ time cython test.pyx

real 0m0.513s user 0m0.196s sys 0m0.052s

Ahora, honestamente, estoy estupefacto. El código que he usado aquí es puro código python, y todo lo que he cambiado es el intérprete. En este caso, si cython es así de bueno, ¿por qué la gente todavía usa el intérprete tradicional de Python? ¿Hay algún problema de confiabilidad para Cython?


Como muchos de los comentarios que sugieren que el tiempo que ha mencionado con cython es solo el tiempo necesario para convertir un archivo .py en un archivo .c. Ese archivo .c será grandes intervalos de memoria. La ventaja es que puede compilar ese archivo .c usando el compilador C también

Le daré un ejemplo: si tiene un archivo de Python, debemos almacenarlo como un archivo .pyx. Al ejecutar " cython xyz.pyx " creará archivos .c y .so

Permite comprobar los archivos de imagen creados por el comando cython

El tamaño también aumenta en mi caso cambió para Bytes a Kb

Hay un método específico para compilar el código python. Puedes consultar estos enlaces:

http://cython.readthedocs.io/en/latest/src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

Otra cosa que noté es que no mencionan los problemas de memoria en cython. Cuando trato de implementarlo en mi proyecto integrado. Estoy enfrentando muchos problemas de memoria.

Puedes probar pypy Donde no hay necesidad de esforzarse más para compilar y el tiempo también se reduce en términos de tiempo de compilación

Consulte la imagen: compare el tiempo entre python y pypy

Gracias..


Cython no es otro intérprete. Genera c-extensions para python, a partir de código python (-like). cython test.pyx solo generará un archivo ''test.c'', que (una vez compilado) puede ser utilizado por python como una biblioteca normal de python.

Eso significa que solo está midiendo el tiempo que le lleva a Cython traducir su código python a c, no la velocidad con la que se ejecuta esa versión de su código.


Las otras respuestas ya explicaron cómo solo estabas compilando el código de Cython, no ejecutándolo. Sin embargo, pensé que podría querer saber cuánto más rápido Cython puede hacer su código. Cuando compilé el código que tiene (aunque ejecuté la función desde un módulo diferente) con distutils , obtuve ganancias de velocidad muy marginales con respecto a Python directo: alrededor del 1%. Sin embargo, cuando agregué algunos pequeños cambios a su código:

def test(long long value): cdef long long i cdef long long z for i in xrange(value): z = i**2 if(i==1000000): print i if z < i: print "yes"

y lo compilé, obtuve los siguientes tiempos:

  • Código Pure Python: 20.4553578737 segundos
  • Código de Cython: 0.199339860234 segundos

Eso es una aceleración de 100x. No está nada mal.


Para cualquiera que desee que cython realmente compilara y ejecutara su programa en una línea, creé runcython ( http://github.com/russell91/runcython ). runcython test.pyx tendrá la semántica que el OP pretendía


Un gran punto que parece faltar: Cython no es un superconjunto estricto de Python. Hay algunas características que admite Python, pero Cython no. En particular, generadores y lambdas (pero vienen).


  • La razón más grande por la que Cython no es tan popular es porque carece de ejecutables independientes (sin Python).

  • Falta de publicidad Los desarrolladores parecen ser académicos más interesados ​​en Desarrollar su software Sage, que un lenguaje de vanguardia.

  • Errores encontrados durante el desarrollo. Uno que encontré es la falta de soporte verdadero de subprocesos. Todo está envuelto en un bloqueo de intérprete global, por lo que es seguro para los hilos, ¡pero desactiva la concurrencia!


  • cython test.pyx realidad no ejecuta su programa. El binario de cython es para procesar su código de Cython en un módulo de extensión de Python. Tendría que importarlo en Python para ejecutarlo.

  • #!/usr/bin/python no es la mejor línea shebang para scripts de Python. #!/usr/bin/env python es generalmente preferido, que ejecuta cualquier python en la línea de comandos.

    • Los archivos Cython pyx probablemente no deberían tener una línea shebang, excepto en el caso de la esquina, son programas válidos de Python.
  • Tienes un IndentationError en el código publicado.

  • Usar el intérprete tradicional es más simple y más portátil. Cython es confiable, pero tiene sus limitaciones y peculiaridades. Podría ser convincente usarlo muchísimo más si, por arte de magia, le diera las aceleraciones que los tiempos hacen parecer, pero en realidad le da a los más pequeños. Tendrás que empezar a usar funciones específicas de Cython para usar las funciones C para ver mucha aceleración.