recursive files filename python traversal glob os.walk directory-walk

python - files - ¿Más rápido que os.walk o glob?



python glob recursive (5)

Hice una investigación en un pequeño caché de páginas web en 1000 direcciones. La tarea era contar un número total de archivos en dirs. La salida es:

os.listdir: 0.7268s, 1326786 files found os.walk: 3.6592s, 1326787 files found glob.glob: 2.0133s, 1326786 files found

Como ves, os.listdir es el más rápido de los tres. Y glog.glob sigue siendo más rápido que os.walk para esta tarea.

La fuente:

import os, time, glob n, t = 0, time.time() for i in range(1000): n += len(os.listdir("./%d" % i)) t = time.time() - t print "os.listdir: %.4fs, %d files found" % (t, n) n, t = 0, time.time() for root, dirs, files in os.walk("./"): for file in files: n += 1 t = time.time() - t print "os.walk: %.4fs, %d files found" % (t, n) n, t = 0, time.time() for i in range(1000): n += len(glob.glob("./%d/*" % i)) t = time.time() - t print "glob.glob: %.4fs, %d files found" % (t, n)

Estoy perdiendo el tiempo con las búsquedas de archivos en python en un disco duro grande. He estado mirando os.walk y glob. Usualmente uso os.walk porque lo encuentro mucho más limpio y parece ser más rápido (para directorios de tamaño habitual).

¿Alguien ha tenido alguna experiencia con ambos y podría decir cuál es más eficiente? Como dije, glob parece ser más lento, pero puedes usar comodines, etc., como con walk, tienes que filtrar los resultados. Aquí hay un ejemplo de la búsqueda de volcados de núcleo.

core = re.compile(r"core/./d*") for root, dirs, files in os.walk("/path/to/dir/") for file in files: if core.search(file): path = os.path.join(root,file) print "Deleting: " + path os.remove(path)

O

for file in iglob("/path/to/dir/core.*") print "Deleting: " + file os.remove(file)


No pierda su tiempo en la optimización antes de medir / perfilar. Concéntrese en hacer que su código sea simple y fácil de mantener.

Por ejemplo, en su código usted precompila RE, lo que no le da ningún impulso de velocidad, porque re modulo tiene re._cache interno de re._cache precompilados.

  1. Mantenlo simple
  2. si es lento, entonces perfil
  3. Una vez que sepa exactamente lo que necesita ser optimizado, haga algunos ajustes y siempre documéntelo.

Tenga en cuenta que algunas optimizaciones realizadas varios años antes pueden hacer que el código se ejecute más lento en comparación con el código "no optimizado". Esto se aplica especialmente para los idiomas modernos basados ​​en JIT.


Puedes usar os.walk y seguir usando la combinación de estilo glob.

for root, dirs, files in os.walk(DIRECTORY): for file in files: if glob.fnmatch.fnmatch(file, PATTERN): print file

No estoy seguro de la velocidad, pero obviamente ya que os.walk es recursivo , hacen cosas diferentes.


Si necesita hacer una orden en los subdirectorios, use os.walk . De lo contrario, creo que sería más fácil usar glob.iglob o os.listdir .


*, ?, and character ranges expressed with [] will be correctly matched. This is done by using the os.listdir() and fnmatch.fnmatch() functions

Pienso que incluso con glob todavía os.walk que os.walk a os.walk , a menos que sepas directamente qué tan profundo es tu árbol de subdirectorios.

Por cierto En la documentación global dice:

"*,?, y los rangos de caracteres expresados ​​con [] coincidirán correctamente. Esto se hace mediante el uso de las funciones os.listdir () y fnmatch.fnmatch ()"

Simplemente iría con un

for path, subdirs, files in os.walk(path): for name in fnmatch.filter(files, search_str): shutil.copy(os.path.join(path,name), dest)