OVH Cloud OVH Cloud

walk

14 réponses
Avatar
Do Re Mi chel La Si Do
Bonjour !

os.walk est dans la librairie standard. Je pensait que c'était une garantie
d'optimisation.
Or, en comparant ces deux fonctions :


def ess1(srep,topdown=False):
lsou=[]
for root, dirs, files in os.walk(srep):
lsou.append(root)
return lsou

def ess2(srep,lsou=[]):
for i in os.listdir(srep):
ste=srep+'\\'+i
if os.path.isdir(ste):
lsou.append(ste)
lsou=ess2(ste,lsou)
return lsou

#ess1(r'D:\Dev\Python')
#ess2(r'D:\Dev\Python')


il s'avère que ess2 est plus rapide que ess1. Pourquoi ?



@-pluche

Michel Claveau

4 réponses

1 2
Avatar
Christophe Cavalaria
Do Re Mi chel La Si Do wrote:

Bonjour !


A quoi sert-il de définir le paramètre topdown de ess1 avec une valeur
par defaut a False ?




Cela paramètre os.walk, pour qu'il mémorise les noms des répertoires,
après avoir parcouru les sous-répertoires. Avec topdown=True, la
mémorisation se ferait avant.


Et pourquoi tu ne passes pas le paramètre à os.walk ?

Pour le reste, je me doute que os.walk fait plus de choses (explication
logique). Je ne suis pas sûr que les liens symboliques, inexistants sous
windows, jouent beaucoup ; par contre il doit y avoir de nombreux tests
pour portabilité (OS, version, etc.) qui doivent peser.


Mais si tu avais regardé le code de os.walk, tu aurais vu que cette fonction
fait un appel de fonction à islink par fichier parcouru. Cet appel même
s'il renvoye toujours faux prend du temps. Et pour information, NTFS
supporte les liens symboliques et les liens hard comme sous Unix, c'est
juste que les fonctions ne sont exposées dans aucune API Win32 standard.
Mais on peut y accéder dans les API de compatibilité POSIX de Microsoft
parait-il :)

Conclusion : principes et croyances ne devraient être que des hypothèses.


@-salutations

Michel Claveau





Avatar
Do Re Mi chel La Si Do
Bonsoir !


Et pourquoi tu ne passes pas le paramètre à os.walk ?




pour faire parler les bavards.



En fait, j'ai fait différents essais, avec et sans le paramètre ; comme ça
ne changeait rien (pour les perfs), j'ai laissé en l'état.



@-salutations

Michel Claveau



Avatar
Do Re Mi chel La Si Do
Re

et pour les perfs, le plus rapide, c'est de wrapper le DIR de windows. Voir
mon message "dégoutant".
Cela n'améliore pas l'image de os.walk()...

@-salutations

Michel Claveau
Avatar
Christophe Cavalaria
Do Re Mi chel La Si Do wrote:

Bonsoir !


Et pourquoi tu ne passes pas le paramètre à os.walk ?




pour faire parler les bavards.


Hé :)

Allez, pour continuer à détendre l'atmosphère, pouvez vous trouver le bug
dans le code suivant :

import os
res = []
for i in os.walk(".", res): res.append(i)




1 2