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.
- Mantenlo simple
- si es lento, entonces perfil
- 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)