Plus rapide à l'os.à pied ou glob?
Je suis de déconner avec le fichier des recherches en python sur un disque dur de grande capacité. J'ai été à la recherche à l'os.de marcher et de glob. J'ai l'habitude de l'utilisation de l'os.pied que je trouve ça beaucoup plus soignée et semble être plus rapide (pour la taille habituelle de répertoires).
Quelqu'un a eu une expérience avec eux deux, et pourrait dire lequel est le plus efficace? Comme je l'ai dit, glob semble être plus lent, mais vous pouvez utiliser des caractères génériques, etc, ont été, comme avec la promenade, vous avez pour filtrer les résultats. Voici un exemple de recherche de core dumps.
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)
Ou
for file in iglob("/path/to/dir/core.*")
print "Deleting: " + file
os.remove(file)
- Sonne comme l'optimisation prématurée pour moi. J'ai jeté un coup d'oeil à la source (hg.python.org/cpython/file/d01208ba482f/Lib/glob.py et hg.python.org/cpython/file/d01208ba482f/Lib/os.py) et de voir que les deux fonctions s'appuient sur
os.listdir
etos.isdir
, donc mon instinct me dit que vous ne gagnez pas beaucoup d'une façon ou de l'autre. (Cependant, comme souligné dans les deux réponses ci-dessous, laos.walk
parcourt plus de sous-répertoires etglob.iglob
ne l'est pas, donc ça n'a pas de sens de comparer). Si vous vous retrouvez avec un problème de performance, profil un couple d'approches. Sinon, il suffit d'écrire un code clair.
Vous devez vous connecter pour publier un commentaire.
J'ai fait une recherche sur un petit cache des pages web dans les 1000 dirs. La tâche était de compter un nombre total de fichiers dans les répertoires. La sortie est:
Comme vous le voyez,
os.listdir
est le plus rapide des trois. Etglog.glob
est encore plus rapide queos.walk
pour cette tâche.La source:
os.walk
paresseux (générateur), tandis queglob
permettra de créer une grande liste en mémoire?glob.iglob
sera de retour un générateur, python 2 docs.python.org/2/library/glob.html#glob.iglob, python 3 docs.python.org/3/library/glob.html#glob.iglobNe perdez pas votre temps à des fins d'optimisation avant de mesurer/profilage. Concentrer sur votre code simple et facile à entretenir.
Par exemple, dans votre code, vous précompiler RE, ce qui n'est pas de vous donner un boost de vitesse, parce qu'une nouvelle module interne
re._cache
de précompilés REs.Noter que certains d'optimisation fait plusieurs années avant peut rendre le code plus lent par rapport à la "non-optimisé" du code. Cela s'applique en particulier pour les modernes JIT en fonction des langues.
Vous pouvez utiliser os.pied et continuer à utiliser glob-style correspondant.
Pas sûr au sujet de la vitesse, mais bien évidemment puisque os.pied est récursive, ils font des choses différentes.
*, ?, and character ranges expressed with [] will be correctly matched. This is done by using the os.listdir() and fnmatch.fnmatch() functions
Je pense que même avec glob vous auriez encore à
os.walk
, sauf si vous connaissez directement la profondeur de votre arborescence de sous-répertoires est.Btw. dans le glob documentation il dit:
Je voudrais simplement aller avec un