Vous êtes dans une situation désavantageuse.
L'Explorateur Windows presque certainement des usages FindFirstFile
/FindNextFile
à la fois de parcourir l'arborescence et de recueillir des informations sur la taille (par lpFindFileData
) en un seul passage, en faisant ce qui est essentiellement un système d'appel par fichier.
Python n'est malheureusement pas votre ami dans ce cas. Ainsi,
-
os.walk
premiers appels os.listdir
(qui appelle en interne FindFirstFile
/FindNextFile
)
-
aucun système supplémentaire appels effectués à partir de ce point ne peut que vous rendre plus lent que l'Explorateur Windows
-
os.walk
puis appelle isdir
pour chaque fichier renvoyé par os.listdir
(qui appelle en interne GetFileAttributesEx
-- ou bien, avant de Win2k, un GetFileAttributes
+FindFirstFile
combo) afin de déterminer si les répéter ou pas
-
os.walk
et os.listdir
effectuera une allocation supplémentaire de mémoire, de la chaîne et les opérations de matrice etc. pour remplir leur valeur de retour
- vous appelez ensuite
getsize
pour chaque fichier renvoyé par os.walk
(ce qui à nouveau des appels GetFileAttributesEx
)
Qui est 3x plus d'appels système par fichier de l'Explorateur Windows, en plus de l'allocation de la mémoire et de la manipulation de frais généraux.
Vous pouvez soit utiliser Anurag de la solution, ou essaie d'appeler, FindFirstFile
/FindNextFile
directement et de manière récursive (qui devrait être comparable à la performance d'un cygwin
ou d'un autre port win32 du -s some_directory
.)
Reportez-vous à l' os.py
pour la mise en œuvre de l' os.walk
, posixmodule.c
pour la mise en œuvre de l' listdir
et win32_stat
(invoqué par les deux isdir
et getsize
.)
Notez que Python os.walk
est sous-optimale sur toutes les plateformes (Windows et *nice), jusqu'à et y compris Python3.1. Sur Windows et *chouettes os.walk
pourrait atteindre la traversée en un seul passage sans appel isdir
depuis les deux FindFirst
/FindNext
(Windows) et opendir
/readdir
(*nix) déjà de retour type de fichier via lpFindFileData->dwFileAttributes
(Windows) et dirent::d_type
(*nix).
Mise à JOUR de noter que, contre toute attente intuitive, peut-être, sur la plupart des configurations modernes (par exemple, Win7 et NTFS, et même certains SMB implémentations) GetFileAttributesEx
est deux fois plus lentement, FindFirstFile
d'un seul fichier (peut-être même plus lent que de parcourir un répertoire FindNextFile
.)