2012-06-09 5 views
5

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.

Respuesta

6

Usar PyPy de hecho descarta las herramientas py2exe y similares, al menos hasta que una sea portada (AFAIK no hay trabajo activo en eso). Aún así, como los binarios PyPy no necesitan ser instalados, puede salirse con la suya con una distribución más complicada que incluye tanto el código fuente de Python como PyPy binary + stdlib y usa un pequeño contenedor (archivo por lotes, ejecutable) para facilitar el inicio. No puedo comentar si WxPython en PyPy es lo suficientemente maduro como para ser utilizado, pero tal vez alguien en pypy-dev, wxpython-dev o cualquiera de los canales de IRC puede dar una recomendación si describes tu situación.

Traducir mi código en RPython no me parece viable. La cadena de herramientas de traducción no es realmente una herramienta para el desarrollo de propósito general, y producir un dll C para incrustación/ctypes parece no trivial. Además, el código RPython realmente es de bajo nivel, lo que hace que su código Python sea lo suficientemente restringido como para volver a escribir la mitad de él.

En cuanto a otras opciones restringidas: parece mezclar CPython (el intérprete original de Python escrito en C) con Cython (un compilador para un lenguaje Python que emite código C adecuado para módulos de extensión CPython). Ambos proyectos están activos. No estoy muy familiarizado con Shedskin, pero parece ser una herramienta para desarrollar programas completos, con poca o ninguna interacción con el código Python no restringido. Cython parece encajar mucho mejor: aunque requiere anotaciones de tipo manual y código de nivel inferior para lograr un rendimiento realmente bueno, es trivial de usar desde Python: el objetivo del proyecto es producir módulos de extensión.

+0

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

+0

@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

3

Definitivamente buscaría en Cython, he estado jugando con eso y he visto aceleraciones de ~ 100x sobre python puro. Use el módulo de perfil para encontrar primero los cuellos de botella. Por lo general, los bucles son las mayores posibilidades de aumentar la velocidad cuando se va a Cython. También debe ver si puede usar operaciones de matriz/vector en Numpy en lugar de bucles, si es así también puede aumentar el rendimiento.Por ejemplo:

a = range(1000000) 
for i in range(len(a)): 
    a[i] += 5 

es lento, muy lento. Por otro lado:

a = numpy.arange(10000000) 
a = a +5 

es rápido, muy rápido.

+0

+1 para mover los números al numpy tanto como sea posible. – huon

+0

Para una matriz tan grande, a + = 5 es posiblemente incluso más rápido – Dhara

0

Corrección: shedskin se puede utilizar para generar módulos de extensión, así como programas completos.

Cuestiones relacionadas