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
¿Y por qué no compilar todo? Es la forma natural de distribuir una aplicación a un tercero (aka, no dar el código)
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
@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.
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 🙂
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?
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.
import py_compile
py_compile.compile(full_path)
y luego find . -name ‘*py’ | xargs rm 😛
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
@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.
Pingback: Descubriendo aplicaciones de django « Towards 2.0 Emprendiendo en época de cambios
¿Cómo podría mejorar la velocidad si estoy utilizando la versión 2.6 de Phyton?
Con el intérprete Pypy y sin utilizar psyco fue 2.51208496094.