2010-11-26 13 views
16

Étant donné le morceau de code:Iterators Python: Que fournit l'Iterator d'iglob() sur la liste de glob()?

from glob import glob, iglob 

for fn in glob('/*'): 
    print fn 

print '' 

for fn in iglob('/*'): 
    print fn 

lecture du documentation pour glob Je vois que glob() retourne une liste de base des fichiers et iglob un itérateur. Cependant, je suis capable de parcourir les deux et la même liste de fichiers est renvoyée par chacun d'entre eux.

J'ai lu la documentation sur Iterator mais elle n'a pas vraiment perdu de clarté sur le sujet!

Alors, quel avantage iglob() renvoyant un Iterator me fournit-il dans la liste de glob()? Est-ce que je gagne des fonctionnalités supplémentaires par rapport à mon ancien ami?

Répondre

18

La différence est mentionné dans la documentation elle-même:

Retour un itérateur qui donne les mêmes valeurs que glob() sans les stocker en fait tout en même temps.

Fondamentalement, liste aura tous les éléments en mémoire. Iterator n'a pas besoin, et donc il nécessite moins de mémoire.

+3

Ajoutez simplement que cela s'appelle 'évaluation paresseuse'. Nous ne faisons rien tant que nous n'en avons pas besoin. – demas

+0

Note: pour un seul répertoire, l'utilisation de la mémoire est la même (en raison de l'implémentation actuelle via 'os.listdir()'). L'avantage est présent s'il y a plusieurs répertoires avec beaucoup de fichiers. – jfs

+0

Comme @JFSebastian a dit, iglob vitesse/avantage mémoire sur glob est gêné par os.listdir() (voir [this] (http://code.activestate.com/lists/python-list/184205/)): ceci Cela signifie qu'ils seront lents sur les répertoires avec beaucoup de fichiers. Si vous avez ce problème, consultez [formic] (http://pypi.python.org/pypi/formic). Exemple [ici] (http://stackoverflow.com/a/10597254/633403). –