約1万個のファイルがあるフォルダーをウォークスルーする必要があります。私の古いvbscriptは、これを処理するのが非常に遅いです。それ以来、RubyとPythonを使い始めたので、3つのスクリプト言語のベンチマークを作成して、どちらがこの仕事に最適かを確認しました。
共有ネットワーク上の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です。
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