- Um ein Gefühl dafür zu bekommen, wie schnell Sie bekommen können, versuchen Sie, und das Timing
du -k
auf das Verzeichnis. Sie werden wahrscheinlich nicht schneller als das mit Python für eine vollständige Liste.
- Wenn Sie auf Python < 3.5 laufen, versuchen Sie, für eine nette Leistungsverbesserung oder scandir zu aktualisieren.
- Wenn Sie wirklich brauchen nicht die ganze Liste von Dateien, sondern kann zB mit den größten 1000 Dateien leben:
Vermeiden Sie die Liste zu halten und verwenden heapq.nlargest mit einem Generator
def get_sizes(root):
for path, dirs, files in os.walk(root):
dirs[:] = [d for d in dirs if not d.startswith('.')]
for file in files:
full_path = os.path.join(path, file)
try:
# keeping the size first means no need for a key function
# which can affect performance
yield (os.path.getsize(full_path), full_path)
except Exception:
pass
import heapq
for (size, name) in heapq.nlargest(1000, get_sizes(r"c:\some\path")):
print(name, size)
EDIT - um unter Windows noch schneller zu werden - os.scandir
liefert Einträge, die bereits die Größe enthalten, um einen weiteren Systemaufruf zu vermeiden.
Dies bedeutet os.scandir
zu verwenden und rekursiv statt sich auf os.walk
zu verlassen, die diese Information nicht liefert.
Es gibt ein ähnliches Arbeitsbeispiel get_tree_size()
Funktion in der scandir PEP 471, die leicht geändert werden kann, um stattdessen Namen und Größen zu liefern. Auf die Größe jedes Eintrags kann mit entry.stat(follow_symlinks=False).st_size
zugegriffen werden.
Wenn Ihr Code funktioniert, ist ein besserer Ort für diese Art von Fragen [Code Review] (https://codereview.stackexchange.com/) –