Мне нужно пройти через папку с примерно десяти тысячами файлов. Мой старый vbscript очень медленно справляется с этим. Поскольку я начал использовать Ruby и Python с тех пор, я сделал тест между тремя языками сценариев, чтобы увидеть, какой из них лучше всего подходит для этой работы.
Результаты тестов ниже в подмножестве из 4500 файлов в общей сети:
Python: 106 seconds
Ruby: 5 seconds
Vbscript: 124 seconds
То, что Vbscript было бы самым медленным, не было неожиданностью, но я не могу объяснить разницу между Ruby и Python. Является ли мой тест для Python не оптимальным? Есть ли более быстрый способ сделать это в Python?
Тест для thumbs.db предназначен только для теста, в действительности есть больше тестов.
Мне нужно что-то, что проверяет каждый файл на пути и не производит слишком большого объема вывода, чтобы не мешать времени. Результаты немного отличаются друг от друга, но не намного.
#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: поскольку я подозревал, что печать вызвала задержку, я протестировал скрипты с печатью всех 4500 файлов, а также печать без изменений, разница остается: R: 5 P: 107 в первом случае и R: 4.5 P: 107 в последний
EDIT2: на основе ответов и комментариев здесь представлена версия Python, которая в некоторых случаях может работать быстрее, пропуская папки
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