Un moyen plus Rapide de Répertoire de marche de la place de l'os.listdir?
Je suis en train d'améliorer les performances de elfinder , un ajax basé sur le gestionnaire de fichiers(elRTE.ru) .
Il utilise le système d'exploitation.listdir dans un recurisve de marcher à travers tous les répertoires de manière récursive et avoir un gain de performance (comme la liste des dir avec 3000 + fichiers prend 7 secondes ) ..
Je suis en train d'améliorer les performances pour elle ici c'est que c'est la marche de la fonction:
for d in os.listdir(path):
pd = os.path.join(path, d)
if os.path.isdir(pd) and not os.path.islink(pd) and self.__isAccepted(d):
tree['dirs'].append(self.__tree(pd))
Mes questions sont :
- Si je change d'os.à pied au lieu de l'os.listdir , serait-il améliorer les performances?
- comment sur l'utilisation de dircache.listdir() ? cache de TOUT le répertoire/subdir contenu à la demande initiale et de retourner mettre en cache les résultats , si tu n'as pas de nouveaux fichiers téléchargés ou pas de modifications dans le fichier?
- Est-il de toute autre méthode de Répertoire de la marche qui est le plus rapide?
- N'importe quel Autre Serveur de fichiers Côté navigateur qui est rapide, écrit en python (mais je préfère le faire de cette rapide)?
De quoi êtes-vous à l'aide de ces données? Si vous pouvez vous permettre de faire la récursivité paresseusement (uniquement appel
Ces données sont pour une base d'ajax filemanager , appelé elfinder de elrte.ru . c'est joli mais le problème est trop lent en raison de la fonction que j'ai collé. Vôtre l'on regarde de pratique , je vais le changer de look pour chaque répertoire au lieu de l'ensemble de la recursiely.
2017 mise à jour: beaucoup d'informations sont obsolètes, ici et maintenant. À savoir,
la version sur laquelle elle a commencé à utiliser? Pas disponible en 2.7 droit ?
os.listdir()
quand vous avez besoin le contenu, pas automatiquement lorsque vous trouvez un nouveau répertoire), alors vous pouvez amortir le coût sur de nombreuses requêtes. C'est la façon dont la plupart des gestionnaires de fichiers de travail dans la pratique.Ces données sont pour une base d'ajax filemanager , appelé elfinder de elrte.ru . c'est joli mais le problème est trop lent en raison de la fonction que j'ai collé. Vôtre l'on regarde de pratique , je vais le changer de look pour chaque répertoire au lieu de l'ensemble de la recursiely.
os.walk()
ne sera pas plus rapide que la marche à la fonction, parce qu'ils ne la plupart les mêmes choses. os.walk()
utilisation os.listdir()
, os.pathisdir()
, etc. Vérifiez le code de os.walk()
et, vous verrez!2017 mise à jour: beaucoup d'informations sont obsolètes, ici et maintenant. À savoir,
os.walk
n'utilise plus listdir
, maintenant, c'est l'aide la plus rapide scandir
.la version sur laquelle elle a commencé à utiliser? Pas disponible en 2.7 droit ?
OriginalL'auteur Phyo Arkar Lwin | 2010-07-01
Vous devez vous connecter pour publier un commentaire.
J'essayais juste de comprendre comment accélérer l'os.marcher sur un largish système de fichiers (de 350 000 fichiers répartis dans environ 50 000 répertoires). Je suis sur une machine linux avec un système de fichiers ext3. J'ai découvert qu'il existe un moyen pour accélérer le processus pour MON cas.
Plus précisément, à l'Aide d'un top-down, à pied, à tout moment de l'os.marche retourne une liste de plus d'un répertoire, j'utilise os.stat pour obtenir le numéro d'inœud de chaque répertoire, et trier le répertoire de la liste par numéro d'inœud. Cela rend la marche surtout la visite de la sous-répertoires dans l'inode de commande, ce qui réduit le disque cherche.
Pour mon cas d'utilisation, il accéléré mon répertoire complet de marche de 18 minutes en bas à 13 minutes...
En fait c'est le moyen le plus rapide. Merci mais la réponse est déjà choisi.
Tour de Nice garlon4, il est difficile de penser à elle de cette façon sans votre indice. Et @V3ss0n, je pense que vous pouvez toujours modifier la réponse choisie à tout moment, si vous le souhaitez.
Si vous la performance est la clé, vous n'avez pas besoin de portabilité, car vous êtes sous Linux, et votre liste est "statique". Vous n'obtenez pas de nouveaux fichiers fréquemment. Alors je vous envisagez d'exécuter un processus externe à l'aide de commandes natives comme "trouver", ou même exécuter certains c un script comme ceci: stackoverflow.com/questions/4204666/... , et de les exporter dans un fichier, et ensuite de lire ce fichier à partir de python. C'est une solution plus rapide dans le scénario donné.
Dans mon cas d'utilisation, j'ai choisi de ne pas savoir si les fichiers et les répertoires avait changé ou pas (c'est pourquoi je marchais entre eux).
OriginalL'auteur
Avez-vous découvrez scandir (précédemment betterwalk)? Ne pas essayer moi-même, mais il y a un la discussion à ce sujet ici et un autre ici. Il prétend avoir une accélération de 3~10x sur MacOSX/Linux et 7~50x sur Windows en évitant les appels redondants à l'os.stat(). Il est également comprise dans la bibliothèque standard de Python 3.5.
De la projet readme.
scandir
est inclus dans Python 3.5 duos
module.Remarque:
scandir
est maintenant inclus dans Python, et c'est en fait utilisé paros.walk
. Donc, si vous pensez à essayerscandir
comme plus rapide de remplacement, vous pouvez oublier!OriginalL'auteur
Vous devriez mesurer directement sur les machines (systèmes d'exploitation, systèmes de fichiers et les caches de celle-ci, etc) de votre intérêt spécifique -- si oui ou non
os.walk
est plus rapide queos.listdir
sur un sujet précis et totalement différente de la machine /OS /FS vais vous dire très peu de choses sur la performance sur vôtre.Pas sûr de ce que tu veux dire par
cachedir.listdir
-- pas de la bibliothèque standard du module de la fonction de ce nom.listdir
déjà à lire le répertoire en un clin d'oeil (comme il doit trier les résultats) neos.walk
(comme il se doit séparer les sous-répertoires de fichiers). Si, en fonction de votre plate-forme, vous avez un moyen rapide d'être informé à propos de fichier/répertoire change, alors il est probablement la peine de la construction de l'arbre et de l'éditer au fur et à mesure des notifications de changement de venir... mais il dépend de la fréquence relative des changements vs demande, qui est, encore une fois, totalement dépendante de votre application spécifique circonstances.jamais bien fonctionné et a finalement été abandonné depuis la version 2.6 de Python et supprimé depuis le Python 3.0, je n'irais certainement pas suggérer.
Ok , alors, va le jeter à la corbeille alors 🙂 Merci!
OriginalL'auteur
Dans l'ordre:
Je doute que vous aurez voir beaucoup de vitesse entre
os.walk
etos.listdir
, puisque les deux s'appuient sur le système de fichiers sous-jacent. En fait, je soupçonne que le système de fichiers sous-jacent va avoir un grand effet sur la vitesse de l'opération.Toute opération de cache va être beaucoup plus rapide que de frapper le système de fichiers (au moins pour le deuxième et le contrôle ultérieur).
Vous pouvez toujours écrire une certaine utilité (ou l'appel à un shell de commande) qui génère la liste des répertoires en dehors de Python, et a appelé que par le biais de la
subprocess
module. Mais c'est un peu compliqué, et je me tourner vers cette solution que si le cache s'est avéré ne pas fonctionner pour vous.Si vous n'avez pas situé un navigateur de fichiers sur le Cheeseshop, vous ne serez probablement pas en trouver un.
OriginalL'auteur
Comment à le faire en bash?
Dans mon cas, ce qui était en train de changer les autorisations sur des milliers de fichiers, cela a beaucoup mieux fonctionné.
Ce n'est pas portable, d'accord. Je n'ai jamais mentionné quoi que ce soit sur ssh.Si l'appel de cammandlines "n'est pas pythonic et hacky" pourquoi est sous-processus module inclus dans python ? De toute façon, j'ai suggessted natif bash qui est beaucoup plus rapide travesting dir arbres de toute python.
>natif bash qui est beaucoup plus rapide travesting je voudrais voir le critère de performance de votre réclamation. >pas pythonic et hacky " pourquoi est sous-processus module inclus dans python je suis sûr que vous n'êtes pas familier avec ce pythonic moyens.
J'étais en train de considérer cette idée pour de simples listes de répertoire...pas à pied des arbres.
find
pourrait être une solution rapide pour pied des arbres. Vrai, il n'est pas pythonic, mais si il est beaucoup plus rapide, parfois, nous devons faire avec. Chaque fois que j'ai besoin de md5 quelque chose, j'utilise un processus secondaire, car selon le même principe, il est beaucoup plus rapide que de courir en natif python.OriginalL'auteur
Vous êtes à la recherche pour fsdir. Il est écrit en C et est faite de travailler avec python. Il est beaucoup plus rapide que la marche de l'arbre standard de python bibliothèques.
OriginalL'auteur
os.path.walk
peut augmenter vos performances, pour deux raisons:1) Si vous pouvez arrêter la marche avant d'avoir parcouru tout, alors, en effet, il sera plus rapide que
listdir
, bien que seulement visible lorsque vous traitez avec de grands arbres,2) Si vous êtes à la liste ÉNORME répertoires, il peut être coûteux de faire la liste renvoyée par
listdir
. (Pas vrai, voir alex commentaire ci-dessous)Toutefois, il ne sera probablement pas faire une différence et peut en fait être plus lente, en raison de l'éventuelle des frais généraux supplémentaires engagés par l'appel de votre
visit
de la fonction et de faire toutes les argument supplémentaire pour l'emballage et le déballage.(Vraiment le seul moyen de répondre à cette question est pour tester vous-même - il ne devrait prendre que quelques minutes)
Eh bien, phooey. Je maintiens mon exhortation que l'on doit tester ces choses.. 🙂
donc c'est moyen pas de différence de performances.. Mais au moins avec os.à pied , n'aurez pas besoin de faire : os.chemin d'accès.isdir(pd) et pas de l'os.chemin d'accès.islink(pd) qu'il donnera des fichiers/répertoires séparément droit? Alrtie je vais le tester et vous faire savoir!
OriginalL'auteur