2010-11-26 7 views
16

Dada la pieza de código:Iteradores de Python: ¿Qué proporciona el iterador de iglob() sobre la lista de glob()?

from glob import glob, iglob 

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

print '' 

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

Lectura de la documentation para pegote veo que glob() devuelve una lista básica de archivos y iglob un iterador. Sin embargo, puedo iterar sobre ambos y cada uno de ellos devuelve la misma lista de archivos.

He leído la documentación en Iterator pero no ha arrojado más luz sobre el tema realmente!

Entonces, ¿qué beneficio me proporciona iglob() que devuelve un iterador sobre la lista de glob()? ¿Obtengo una funcionalidad extra sobre mi viejo amigo la humilde lista?

Respuesta

18

La diferencia se menciona en la documentación de sí mismo:

Return un iterador que produce los mismos valores que glob() sin llegar a almacenar todos ellos simultáneamente.

Básicamente la lista tendrá todos los elementos en la memoria. El iterador no necesita, y por lo tanto requiere menos memoria.

+3

Solo agregue que se llama 'evaluación diferida'. No hacemos nada hasta que no lo necesitemos. – demas

+0

Nota: para un solo directorio, el uso de la memoria es el mismo (debido a la implementación actual a través de 'os.listdir()'). La ventaja está presente si hay múltiples directorios con muchos archivos. – jfs

+0

Como dijo @JFSebastian, la ventaja de iglob speed/memory sobre glob se ve obstaculizada por os.listdir() (ver [esto] (http://code.activestate.com/lists/python-list/184205/)): esto significa que ambos serán lentos en directorios con muchos archivos. Si tiene ese problema, consulte [formic] (http://pypi.python.org/pypi/formic). Ejemplo [aquí] (http://stackoverflow.com/a/10597254/633403). –

Cuestiones relacionadas