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



12 pensamientos en “Python más rápido con Psyco”

  1. @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.

  2. 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 🙂

  3. 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?

  4. 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.

  5. Pingback: Descubriendo aplicaciones de django « Towards 2.0 Emprendiendo en época de cambios

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.