J'ai besoin de marcher à travers un dossier avec près de dix mille fichiers. Mon vieux vbscript est très lent dans le traitement de ce. Depuis que j'ai commencé à l'aide de Ruby et Python depuis, j'ai fait un benchmark entre les trois langages de script pour voir ce qui serait le mieux adapté pour ce travail.
Les résultats des tests ci-dessous sur un sous-ensemble de 4500 fichiers sur un réseau partagé sont
Python: 106 seconds
Ruby: 5 seconds
Vbscript: 124 seconds
Que Vbscript serait plus lent n'était pas une surprise, mais je ne peux pas expliquer la différence entre Ruby et Python. Est mon test pour Python n'est pas optimal? Est-il un moyen plus rapide de le faire en Python?
Le test pour les pouces.db est juste pour le test, en réalité il n'y a plus de tests à faire.
J'ai besoin de quelque chose qui vérifie tous les fichiers sur le chemin et ne pas produire trop de sortie pour ne pas perturber le calendrier. Les résultats sont un peu différents, chaque terme, mais pas par beaucoup.
#python2.7.0
import os
def recurse(path):
for (path, dirs, files) in os.walk(path):
for file in files:
if file.lower() == "thumbs.db":
print (path+'/'+file)
if __name__ == '__main__':
import timeit
path = '//server/share/folder/'
print(timeit.timeit('recurse("'+path+'")', setup="from __main__ import recurse", number=1))
'vbscript5.7
set oFso = CreateObject("Scripting.FileSystemObject")
const path = "\\server\share\folder"
start = Timer
myLCfilename="thumbs.db"
sub recurse(folder)
for each file in folder.Files
if lCase(file.name) = myLCfilename then
wscript.echo file
end if
next
for each subfolder in folder.SubFolders
call Recurse(subfolder)
next
end Sub
set folder = oFso.getFolder(path)
recurse(folder)
wscript.echo Timer-start
#ruby1.9.3
require 'benchmark'
def recursive(path, bench)
bench.report(path) do
Dir["#{path}/**/**"].each{|file| puts file if File.basename(file).downcase == "thumbs.db"}
end
end
path = '//server/share/folder/'
Benchmark.bm {|bench| recursive(path, bench)}
EDIT: depuis que j'ai soupçonné l'impression causé un retard j'ai testé les scripts avec l'impression de tous les 4500 fichiers et d'impression aucune, la différence demeure, R:5 P:107 dans le premier cas et R:4.5 P:107 dans le dernier
EDIT2: sur la base des réponses et des commentaires ici une version de Python qui dans certains cas pourrait courir plus vite en sautant les dossiers
import os
def recurse(path):
for (path, dirs, files) in os.walk(path):
for file in files:
if file.lower() == "thumbs.db":
print (path+'/'+file)
def recurse2(path):
for (path, dirs, files) in os.walk(path):
for dir in dirs:
if dir in ('comics'):
dirs.remove(dir)
for file in files:
if file.lower() == "thumbs.db":
print (path+'/'+file)
if __name__ == '__main__':
import timeit
path = 'f:/'
print(timeit.timeit('recurse("'+path+'")', setup="from __main__ import recurse", number=1))
#6.20102692
print(timeit.timeit('recurse2("'+path+'")', setup="from __main__ import recurse2", number=1))
#2.73848228
#ruby 5.7