psyco est un module qu'on installe et qui permet d'accélérer l'exécution de n'importe quel programme Python de x2 à x100.
En fait, psyco ajoute une compilation en code machine alors que la compilation normale de Python s'arrête aux “bytecodes” qui sont eux-même interprétés.
De ce fait, psyco est limité aux processeurs de type i386.
Site de référence: http://psyco.sourceforge.net/
Le manuel est ici: http://psyco.sourceforge.net/psycoguide/index.html
Téléchargement de la version exécutable Windows psyco-1.6.win32-py25.exe (pour Python version 2.5) trouvée ici: http://sourceforge.net/project/showfiles.php?group_id=41036
Pour l'installation, il suffit d'exécuter ce programme, et le module psyco vient se loger dans C:\Python25\Lib\site-packages.
Si vous avez une version de Python inférieure à 2.5, cherchez le bon programme au même endroit (pour Python v 2.4 ou 2.3).
Pour Windows: psyco est compatible avec py2exe, ce qui fait qu'un programme pourra s'exécuter accéléré par psyco, sans que celui-ci ne soit installé sur le PC.
Pour Linux, il est conseillé de partir de la source et de la compiler.
Téléchargement de psyco-1.6-src.tar.gz trouvé ici: http://sourceforge.net/project/showfiles.php?group_id=41036
On désarchive dans le répertoire site-packages de Python (sous la suse 10.3, c'est: /usr/lib/python2.5/site-packages)
Il faut avoir installé tout ce qu'il faut pour une compilation: à voir selon votre distribution. Pour la mienne (suse 10.3), c'est:
En console sous root, on se place dans le répertoire en question (chez moi: /usr/lib/python2.5/site-packages/psyco-1.6). Et on fait:
python setup.py install
S'il y une une erreur, c'est qu'il manque quelque chose pour la compilation dans votre distribution: lisez les codes d'erreur. S'il n'y a pas d'erreur: ça y est, vous avez psyco!
Dans le code du programme principal, vous mettez par exemple:
if __name__ == "__main__": try: import psyco psyco.full() except ImportError: pass ... suite de votre programme ...
L'avantage, c'est que si le module psyco n'est pas disponible, votre programme s'exécutera normalement (non-accéléré).
Et c'est tout!
A titre d'essai, je vous propose une fonction qui cherche la liste de tous les nombres premiers inférieurs à une valeur donnée:
#!/usr/bin/python # -*- coding: latin1 -*- from __future__ import division import time from math import * def premiers(n): """premiers(n): trouve tous les nombres premiers <= n et les affiche sous forme d'une liste""" if n==1: return [] if n==2: return [2] if n in (3,4): return [2,3] if n in (5,6): return [2,3,5] p=[2,3,5] k=7 while k<=n: rk=int(sqrt(k))+1 i=0 while i<len(p): if p[i]>rk: p.append(k) break if (k % p[i])==0: break i+=1 k+=2 return p if __name__ == "__main__": try: import psyco psyco.full() except ImportError: pass tps=time.clock() premiers(1000000) print time.clock()-tps
Pour comparer “avec ou sans psyco”, il suffit de mettre psyco en commentaire dans le code pour la partie “sans psyco”.
Résultat des courses: avec premiers(1000000), on trouve:
Ce qui représente tout de même une division par 15 du temps de calcul!
Mes différents essais m'ont montré que sur certains programmes, on était proche du temps de calcul du C.
Pour ces 2 points, voir sur le site http://psyco.sourceforge.net/, et en particulier le manuel: http://psyco.sourceforge.net/psycoguide/index.html