Beaucoup d'entre eux ne sont pas exactement des itérateurs, mais des objets de vue spéciaux. Par exemple, range() renvoie maintenant quelque chose de similaire à l'ancien objet xrange - il peut toujours être indexé, mais construit paresseusement les entiers selon les besoins.
De même dict.keys() donne un objet dict_keys implémentant une vue sur le dict, plutôt que de créer une nouvelle liste avec une copie des clés.
Comment cela affecte les empreintes de mémoire dépend probablement du programme. Il y a certainement plus d'emphase sur l'utilisation des itérateurs, sauf si vous avez vraiment besoin de listes, alors que l'utilisation de listes était généralement le cas par défaut dans python2. Cela entraînera probablement un programme plus efficace en termes de mémoire. Les cas où il y a vraiment de grosses économies vont probablement être implémentés comme itérateurs dans les programmes python2, étant donné que l'utilisation de la mémoire est très importante et est plus susceptible d'être déjà adressée. (par exemple, l'itérateur de fichier est déjà beaucoup plus efficace en mémoire que l'ancienne méthode file.readlines()
)
La conversion est effectuée par l'outil 2to3, et convertit généralement des éléments tels que range() en itérateurs où il peut déterminer en toute sécurité une liste réelle. « t nécessaire, donc le code comme:
for x in range(10): print x
passera au nouvel objet gamme(), sans créer plus d'une liste, et ainsi obtiendra la prestation de mémoire réduite, mais le code comme:
x = range(20)
sera converti en:
x = list(range(20))
que le convertisseur ne peut pas savoir si le code prévoit un objet réel de la liste dans x.