這是在參考Get MD5 hash of big files in Python和Hashlib in Windows and LinuxHashlib:在md5.update使用組塊的最佳大小()
在響應於這兩個問題,建議在函數MD5使用較大的數據塊.update()來提高性能。
我所做的所有測試似乎表明使用較小的塊可以獲得最佳性能。
考慮下面的代碼:
def test(factor):
filehash = hashlib.md5()
blk_size_to_read = filehash.block_size * (2**factor)
with open(largetestfile, 'rb') as f:
read_data = f.read(blk_size_to_read)
filehash.update(read_data)
filehash.digest()
if __name__ == '__main__':
for ctr in xrange(0, 12):
funcstr = "test({})".format(str(ctr))
timetaken = timeit.timeit(funcstr, setup="from __main__ import test", number = 5000)
print "Factor: {} Time: {}".format(str(ctr), str(timetaken))
我已經做了所有的測試表明,最佳性能是使用factor
0或1時(即,64或128個字節)來實現的。
爲什麼我看到與引用問題中指出的結果不同的任何原因?
我試圖二進制和純文本文件有大小不等的700MB到1.2GB,並使用Python 2.7.3我在Ubuntu 12.04
次要的問題:我使用timeit的方式,它應該是什麼?
爲了好奇的緣故,你能告訴我們你發現什麼是最佳的塊大小嗎? – 2rs2ts
當您的塊大小增加時,性能將趨於朝着系統運行md5代碼的最大理論吞吐量逐漸增加。當你緩衝1MiB時,速度的增加早已變得無關緊要。如果你想選擇一個任意的緩衝區大小,我建議128k。所有哈希函數都是如此。 – gps
@ 2rs2ts最佳大小爲65536字節。請參閱上面的更新。 – Verma