Это относится к Получение MD5-хэша больших файлов в Python и Hashlib в Windows и Linux
В ответах на оба этих вопроса рекомендуется использовать большие фрагменты данных в функции 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 байтов).
По какой причине я вижу результаты, отличные от тех, которые указаны в процитированных вопросах?
Я пробовал двоичные и простые текстовые файлы размером от 700 МБ до 1,2 ГБ и использую Python 2.7.3 на Ubuntu 12.04.
Второй вопрос: я использую timeit так, как должно быть?