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 decython
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 cualquierpython
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.
- Los archivos Cython
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.