Estoy buscando brindar mejoras de velocidad a una aplicación existente y estoy buscando asesoramiento sobre mis posibles opciones. La aplicación está escrita en Python, usa wxPython y está empaquetada con py2exe
(solo me refiero a plataformas de Windows). Las partes de la aplicación son computacionalmente intensivas y se ejecutan muy lentamente en Python interpretado. No estoy familiarizado con C, por lo que portar partes del código no es realmente una opción para mí.Acelerando partes de la aplicación de Python existente con PyPy o shedskin
Así que mi pregunta es, básicamente, ¿tengo una idea clara de mis opciones, como lo describo a continuación, o me estoy acercando a esto desde la dirección equivocada?
- ejecuta con PyPy: Hoy comenzó a experimentar con PyPy - los resultados son emocionantes, en el que se pueden ejecutar grandes partes del código del intérprete PyPy y yo estoy viendo mejoras 5x + velocidad sin cambios en el código . Sin embargo, si entiendo correctamente, (a) Pypy con soporte de wxpython es still a work in progress, y (b) I cannot compile it down to an exe for distribution anyway. Entonces, a menos que esté equivocado, esto parece un no-ir para mí. No hay forma de empaquetar cosas así que algunas partes se ejecutan con pypy?
- Convirtiendo el código a RPython, traduciendo con pypy Así que la siguiente opción parece ser reescribir partes del código para el lenguaje restringido pypy, que parece un trabajo bastante grande. Pero si hago eso, partes del código pueden compilarse en un ejecutable (?) Y luego puedo acceder al código a través de ctypes (?).
- Otras opciones restringidas Shedskin parece ser una alternativa popular aquí, ¿se ajusta mejor a mis necesidades? Otras opciones parecen ser Cpython, Psyco y Unladen, pero todas están reemplazadas o ya no se mantienen.
Muchas gracias, he aceptado su respuesta. Sin embargo, después de una tarde muy productiva jugando con Cython, creo que he llegado a un problema insuperable: la falta de soporte de subprocesos de Cython. Mis cálculos computacionalmente costosos, que antes funcionaban en subprocesos y no bloqueaban la GUI, ahora congelan todo. De buscar en Google, parece que esto es por diseño; obtener el paralelismo (http://docs.cython.org/src/userguide/parallelism.html#parallel) es liberar el GIL, y todo el código en el GIL no puede usar ningún objeto python nativo, ¿entiendo esto correctamente? Eso no haría bueno a Cython. – misshapen
@NickJ (1) No sé si Cython admite subprocesos de Python, pero no veo por qué no podría hacerlo. Tal vez la alternativa a la que se vincula es simplemente * preferred *, porque puede usar varias CPU. (2) No estoy seguro si es un error de tu parte, pero el código protegido por GIL * sería * capaz de usar tipos de Python, mientras que las secciones 'nogil' no pueden (porque CPython, y por lo tanto todos los tipos de Python, dependen de el GIL). (3) Aparte de eso, podrías salir sin "enhebrar" en Cython colocando lo que quieras paralelizar en funciones de Cython relativamente puras y pateando el hilo a través de Python. – delnan