Python más rápido con Psyco

Psyco es un módulo que nos permite mejorar enormemente la velocidad de nuestras aplicaciones Python a cambio de un ligero incremento en el tiempo de inicialización. Esto se logra compilando parte del código de la aplicación en tiempo de ejecución (compilador JIT o Just In Time).

Basta con añadir un par de líneas al comienzo de nuestro script para que Psyco compile tanto código como sea posible.

import psyco
psyco.full()

Para aplicaciones complejas el uso de la función full puede no ser lo más adecuado, puesto que se necesitaría una gran cantidad de tiempo y memoria para compilar todo el código. En estos casos puede ser de mayor utilidad la función psyco.profile() con la que Psyco realizará un pequeño estudio del código y comprobará qué funciones merece la pena compilar.

import psyco
psyco.profile()

También puede ser de utilidad llamar primero a la función psyco.log() para Psyco cree un archivo en el que registrar el tiempo y la memoria utilizados para ejecutar el programa, así como cualquier problema con los que se pueda haber encontrado.

import psyco
psyco.log()
psyco.profile()

También podemos indicar de forma explicita la función, método o clase que queramos compilar usando la función bind

import psyco
psyco.bind(mi_funcion)

Como ejemplo de lo que es capaz de hacer Psyco veamos cuánto tardaríamos en ordenar una lista de 1 millón de elementos utilizando el algoritmo quick sort con y sin Psyco.

import random
import psyco
import time


def quick_sort(lista):
    if not lista: 
        return []
    else:
        pivote = lista[0]
        menor = quick_sort([x for x in lista[1:] if x < pivote])
        mayor = quick_sort([x for x in lista[1:] if x >= pivote])
        return menor + [pivote] + mayor


lista = range(1, 1000000)
random.shuffle(lista)

inicio = time.time()
quick_sort(lista)
fin = time.time()

print "Sin Psyco", fin - inicio

psyco.full()

inicio = time.time()
quick_sort(lista)
fin = time.time()

print "Con Psyco", fin - inicio

En mi caso el resultado es el siguiente:

$ python ej-psyco.py
Sin Psyco 9.95299983025
Con Psyco 5.45300006866



Comentarios
  1. ¿Y por qué no compilar todo? Es la forma natural de distribuir una aplicación a un tercero (aka, no dar el código)

    Responder

  2. Buen post. Una aclaración: Psyco no está “discontinuado”, pero su desarrollador (Armin Rigo) hace tiempo que está laburando en PyPy, con lo cual supongo que debe estar algo “parado”, eso sí.

    Saludos

    Responder

  3. @Blaxter también hay proyectos que hacen eso, como el nuevo shedskin.

    @Marcelo Fernández si, lo se. Tengo pensado una serie de posts sobre rendimiento. Ya hablaré de PyPy y de shedskin en un futuro.

    Responder

  4. Gracias. No conocía este módulo y para los programas que estoy haciendo me va a venir muy bien. Algunos programas como Pyecm que importan psyco van mucho más rápido 🙂

    Responder

  5. guillem

    Aunque la ventaja es evidente, no sería mejor realizar una extensión con C/C++?

    Un quicksort en C++ con los mismos parámetros tarda 0.5 segundos.

    ¿Tan abismal es la diferencia?

    Responder

  6. guillem

    Realizando el mismo test con python en mi ordenador me da:

    Sin Psyco 15.6970510483
    Con Psyco 7.42037701607

    Aunque la implementación de qsort() de C++ sea más óptima, tenemos que con python sin psyco va 31 veces más lento que con C++.

    Obs: la implementación en C++ es con enteros.

    Responder

  7. import py_compile
    py_compile.compile(full_path)

    y luego find . -name ‘*py’ | xargs rm 😛

    Responder

  8. Blaxter, me ocurre una cosa curiosa XD

    Ejecutando a pelo:
    Con Psyco 4.0106780529
    Sin Psyco 8.88323688507

    Usando py_compile:
    Con Psyco 3.72959303856
    Sin Psyco 10.1571648121

    Responder

  9. @Blaxter en realidad eso compila a byte code de la máquina virtual de Python, no a código máquina, así que todavía habría lugar para mejora.

    Responder

  10. […] encontré una interesante herramienta psyco (gracias a mundogeek) que permite mejorar los tiempos de ejecución de código python y controlar el rendimiento del […]

    Responder

  11. ¿Cómo podría mejorar la velocidad si estoy utilizando la versión 2.6 de Phyton?

    Responder

  12. Giardy

    Con el intérprete Pypy y sin utilizar psyco fue 2.51208496094.

    Responder

Deja un comentario