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.

446<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

...<br />

>>> timeit.Timer('func1()', 'from __main__ import func1').timeit(100)<br />

12.883871078491211<br />

>>> timeit.Timer('func2()', 'from __main__ import func2').timeit(100)<br />

7.4781858921051025<br />

Minimiser les appels et rapprocher le code<br />

D’un point de vue interpréteur, tout appel à une fonction ou une méthode nécessite<br />

de faire une recherche dans le contexte local et/ou global. Si cette fonction est un<br />

attribut d’un objet du contexte, une recherche dans l’attribut __dict__ de l’objet en<br />

question est de plus nécessaire, et ainsi de suite.<br />

Pour résumer, plus le code est éloigné et éparpillé, plus son accès est coûteux.<br />

Pour les hot spots, c’est-à-dire les portions de code à optimiser d’urgence, minimiser<br />

les accès à du code externe est un exercice très rentable. Une des méthodes consiste à<br />

regrouper des fonctions dans une seule et même fonction, en agrégeant si nécessaire<br />

les données utilisées en un seul ensemble de paramètres.<br />

L’exemple ci-dessous est le plus simple, mais le plus parlant : dans une fonction, une<br />

boucle appelle à chaque itération une autre fonction. On repousse cette boucle dans<br />

la fonction, qui prend alors en charge la séquence d’éléments au lieu de ne travailler<br />

que sur un seul élément. On passe dans ce cas à un seul appel extérieur.<br />

Fédération de code<br />

>>> import timeit<br />

>>> def version1(element):<br />

... return element.upper()<br />

...<br />

>>> def version2(elements):<br />

... elements[:] = [element.upper() for element in elements]<br />

...<br />

>>> def code_appelant1():<br />

... liste = ['azerty', 'qwerty', 'peu importe']<br />

... for i in range(5):# pour faire une liste + grosse<br />

... liste = liste + liste<br />

... return [version1(phrase) for phrase in liste]<br />

...<br />

>>> def code_appelant2():<br />

... liste = ['azerty', 'qwerty', 'peu importe']<br />

... for i in range(5): # pour faire une liste + grosse<br />

... liste = liste + liste<br />

... version2(liste)<br />

... return liste<br />

...

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

Saved successfully!

Ooh no, something went wrong!