我需要通过一个文件夹与大约十万个文件走。 我的老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在后者
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