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.

Bonnes pratiques et optimisation du code<br />

CHAPITRE 13<br />

Cette solution n’est cependant pas optimale et peut ralentir le code de manière conséquente.<br />

Pour accélérer les tris d’objets complexes, le code pattern le plus efficace<br />

consiste à utiliser la transformation de schwartzian : utiliser le tri interne de la classe<br />

list, en modifiant la liste pour que chaque élément devienne un tuple, composé de<br />

l’attribut à trier puis de l’élément d’origine.<br />

Cet attribut extrait devient la clé de tri, et permet d’obtenir le même résultat.<br />

Tri par extraction de clé<br />

>>> class A:<br />

... def __init__(self, title):<br />

... self.title = title<br />

... def __str__(self):<br />

... return 'Film: %s' % self.title<br />

...<br />

>>> A1 = A('Qui veut la peau de mes 64 bits ?')<br />

>>> A2 = A('Ali Baba et les 40 valeurs')<br />

>>> A3 = A('Placer ici un titre de film plus drôle que les précédents')<br />

>>> mes_films = [A1, A2, A3]<br />

>>> tri_mes_films = []<br />

>>> for film in mes_films:<br />

... tri_mes_films.append((film.title, film))<br />

...<br />

>>> tri_mes_films.sort()<br />

>>> films_tries = []<br />

>>> for cle_de_tri, film in tri_mes_films:<br />

... films_tries.append(film)<br />

...<br />

>>> for film in films_tries:<br />

... print str(film)<br />

...<br />

Film: Ali Baba et les 40 valeurs<br />

Film: Placer ici un titre de film plus drôle que les précédents<br />

Film: Qui veut la peau de mes 64 bits ?<br />

On peut généraliser le code pattern en proposant une fonction de tri inplace, qui<br />

prend en paramètres la séquence et l’attribut à utiliser.<br />

Code pattern de tri inplace d’objets<br />

>>> def tri_liste(liste, attribut):<br />

... liste[:] = [(getattr(elem, attribut), elem) for elem in liste]<br />

... liste.sort()<br />

... liste[:] = [elem for cle, elem in liste]<br />

443

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

Saved successfully!

Ooh no, something went wrong!