17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

478<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

[...]<br />

temps = timeit.Timer('normal()',<br />

'from __main__ import normal').timeit(10000)<br />

print('sans psyco: %f s' % temps)<br />

import psyco<br />

psyco.full()<br />

temps = timeit.Timer('normal()',<br />

'from __main__ import normal').timeit(10000)<br />

print('avec psyco: %f s' % temps)<br />

$ python psycote.py<br />

sans psyco: 13.725044 s<br />

avec psyco: 0.223533 s<br />

Les gains de performance sont importants sur toutes les opérations arithmétiques et<br />

les boucles répétitives.<br />

Psyco analyse le code à exécuter à la volée et tente, lorsque c’est possible, de remplacer<br />

directement ce code en mémoire par son équivalent en langage machine.<br />

Cette mécanique a cependant des restrictions lourdes :<br />

inopérant lorsque map() et filter() sont utilisées dans le code ;<br />

impossibilité de surcharger une primitive ;<br />

impossibilité de modifier dynamiquement les méthodes des new-style classes ;<br />

incompatible avec le module rexec ;<br />

impossibilité de changer dynamiquement le type d’un objet (en modifiant son<br />

attribut __class__) ;<br />

l’opérateur is ne fonctionne pas toujours correctement sur les objets globaux de<br />

types non modifiables.<br />

Il est donc conseillé de cibler son utilisation à des fonctions d’opérations algorithmiques<br />

isolées.<br />

L’usage le plus souple consiste à créer un decorator qui permette d’enclencher Psyco<br />

pour des fonctions précises. Le module fournit une fonction proxy() qui permet<br />

d’implémenter directement le decorator : elle renvoie une version optimisée de<br />

n’importe quel objet callable passé en paramètre.<br />

Decorator psycoed<br />

import psyco<br />

# decorator psycoed<br />

def psycoed(function):

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!