тесты: есть ли у python более быстрый способ обхода сетевой папки?
Мне нужно пройти через папку с примерно десятью тысячами файлов. Мой старый 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)}
РЕДАКТИРОВАТЬ: так как я подозревал, что печать привела к задержке, я протестировал сценарии с печатью всех 4500 файлов, а также без печати, разница остается: R: 5 P: 107 в первом случае и R: 4,5 P: 107 в последнем
РЕДАКТИРОВАТЬ 2: на основе ответов и комментариев здесь версия 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