Für den Fall, dass sich jemand dafür interessiert, habe ich ein Profil der drei wichtigsten vorgeschlagenen Methoden erstellt. Ich habe etwa 500.000 Dateien im Ordner "globbed" (insgesamt) und 2.000 Dateien, die dem gewünschten Muster entsprechen.
Hier ist der (sehr einfache) Code
import glob
import json
import fnmatch
import os
from pathlib import Path
from time import time
def find_files_iglob():
return glob.iglob("./data/**/data.json", recursive=True)
def find_files_oswalk():
for root, dirnames, filenames in os.walk('data'):
for filename in fnmatch.filter(filenames, 'data.json'):
yield os.path.join(root, filename)
def find_files_rglob():
return Path('data').rglob('data.json')
t0 = time()
for f in find_files_oswalk(): pass
t1 = time()
for f in find_files_rglob(): pass
t2 = time()
for f in find_files_iglob(): pass
t3 = time()
print(t1-t0, t2-t1, t3-t2)
Und die Ergebnisse waren:
os_walk: ~3.6sec
rglob ~14.5sec
iglob: ~16.9sec
Die Plattform: Ubuntu 16.04, x86_64 (Core i7),