UKOnline

Parcours de collection

Il existe plusieurs manières de parcourir une collection d'éléments, que ce soit une chaine de caractères, une liste, un tuple, un ensemble, ou un dictionnaire. Le plus facile consiste à itérer sur les éléments de la collection à l'aide d'une boucle for...in. Il s'agit de la manière de faire la plus « pythonique » et efficace, dans la plupart des cas.

Néanmoins, dans le cas de séquences, on a parfois besoin d'accéder aux éléments de la séquence en même temps que leur indice. L'exemple suivant calcule le carré de tous les éléments d'une liste reçue en paramètre, à l'aide d'une boucle while et d'une variable i qui parcourt les indices de la séquence, et renvoie une chaine de caractères comme résultat :

On peut faire un peu mieux en utilisant une boucle for, ce qui permet d'éviter de gérer la variable i explicitement :

La seconde fonction est plus rapide que la première. En effet, on passe de 141 ms à 119 ms pour traiter une liste de cent-mille éléments, soit une diminution de temps de 16 %. Dans les deux cas, la boucle permet de générer une séquence d'indices i permettant d'obtenir les éléments de la liste avec l'expression x[i].

Fonction enumerate

Lorsque l'on souhaite parcourir les éléments d'une séquence tout en ayant accès à leur indice dans la séquence, on peut utiliser la fonction prédéfinie enumerate. Elle renvoie un itérateur de tuples avec l'indice comme premier élément et la valeur associée comme second élément.

On peut ainsi écrire une troisième version de la fonction de calcul des carrés des éléments d'une liste, qui utilise enumerate :

Cette troisième fonction est encore plus rapide en réalisant le même traitement que précédemment en seulement 109 ms, à savoir une diminution de 23 % par rapport à la première fonction.

On pourrait même aller encore plus loin, avec une quatrième version en définissant la liste en compréhension et en utilisant la méthode join pour éviter les concaténations :

Cette dernière version ne prend que 95 ms d'exécution, soit une diminution de 33 % par rapport à la première fonction.

Fonction zip

Lorsque l'on souhaite parcourir deux séquences de même longueur, en parallèle, on est vite tenté d'utiliser une boucle while ou for pour obtenir l'indice de parcours de manière explicite. La fonction prédéfinie zip renvoie un itérateur de tuples à plusieurs éléments, chacun provenant d'une séquence différente, mais positionné au même indice.

On peut donc utiliser la fonction zip pour parcourir plusieurs séquences en parallèle. Voici deux fonctions qui permettent de calculer la somme de deux séquences de nombres :

La seconde fonction est beaucoup plus rapide que la première. En effet, on passe de 44 ms à 17 ms pour calculer la somme de deux listes de cent-mille éléments, soit une diminution de temps de 61 %.