web-dev-qa-db-fra.com

Quand est-il préférable d'utiliser Zip au lieu d'izip?

Quand est-il préférable d'utiliser Zip au lieu de itertools.izip ?

72
Neil G

Lorsque vous savez que vous voudrez que la liste complète des éléments soit construite (par exemple, pour passer à une fonction qui modifierait cette liste sur place). Ou lorsque vous voulez forcer les arguments que vous passez à Zip() à être complètement évalués à ce point spécifique.

39
Amber

Zip calcule toute la liste à la fois, izip ne calcule les éléments que sur demande.

Une différence importante est que "Zip" renvoie une liste réelle, "izip" renvoie un "objet izip", qui n'est pas une liste et ne prend pas en charge les fonctionnalités spécifiques à la liste (telles que l'indexation):

>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [2, 3, 4, 5, 6, 7]
>>> z = Zip(l1, l2)
>>> iz = izip(l1, l2)
>>> isinstance(Zip(l1, l2), list)
True
>>> isinstance(izip(l1, l2), list)
False
>>> z[::2] #Get odd places
[(1, 2), (3, 4), (5, 6)]
>>> iz[::2] #Same with izip
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'itertools.izip' object is unsubscriptable

Donc, si vous avez besoin d'une liste (et non d'un objet de type liste), utilisez simplement 'Zip'.

En dehors de cela, 'izip' peut être utile pour économiser de la mémoire ou des cycles.

Par exemple. le code suivant peut sortir après quelques cycles, il n'est donc pas nécessaire de calculer tous les éléments de la liste combinée:

lst_a = ... #list with very large number of items
lst_b = ... #list with very large number of items
#At each cycle, the next couple is provided
for a, b in izip(lst_a, lst_b):
    if a == b:
        break
print a

l'utilisation de Zip aurait calculé tous(a, b) couples avant d'entrer dans le cycle.

De plus, si lst_a Et lst_b Sont très volumineux (par exemple des millions d'enregistrements), Zip(a, b) construira une troisième liste avec un double espace.

Mais si vous avez de petites listes, Zip est peut-être plus rapide.

91
Dona

Dans 2.x, lorsque vous besoin une liste au lieu d'un itérateur.

5

La bibliothèque itertools fournit des "itérateurs" pour les fonctions courantes Python. À partir des documents itertools, "Comme Zip () sauf qu'il renvoie un itérateur au lieu d'une liste." Le I dans izip () signifie "itérateur".

Les itérateurs Python sont une séquence "chargée paresseusement" qui économise de la mémoire par rapport à la liste régulière en mémoire. Ainsi, vous utiliseriez itertools.izip (a, b) lorsque les deux entrées a, b sont trop grandes pour être conservées en mémoire à un moment donné.

Recherchez les concepts Python liés au traitement séquentiel efficace:

"generators" & "yield"
"iterators"
"lazy loading"
5
Sakib Ahammed