我希望能够通过多进程计算同一文件的多个哈希值,以节省时间。
从我的观察来看,从固态硬盘读取文件相对较快,但哈希计算几乎要慢4倍。如果我想计算2个不同的哈希(md5和sha),那么速度就会慢8倍。我想能够在不同的处理器核心上并行计算不同的哈希(最多4个,取决于设置),但不知道如何避开全局解释器锁(GIL)。
这是我的当前代码(hash.py
):
import hashlib
from io import DEFAULT_BUFFER_SIZE
file = 'test/file.mov' #50MG file
def hash_md5(file):
md5 = hashlib.md5()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
md5.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return md5.hexdigest()
def hash_sha(file):
sha = hashlib.sha1()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
sha.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return sha.hexdigest()
def hash_md5_sha(file):
md5 = hashlib.md5()
sha = hashlib.sha1()
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
md5.update(chunk)
sha.update(chunk)
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return md5.hexdigest(), sha.hexdigest()
def read_file(file):
with open(file, mode='rb') as fl:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
while chunk:
chunk = fl.read(DEFAULT_BUFFER_SIZE)
return
我做了一些测试,以下是结果:
from hash import *
from timeit import timeit
timeit(stmt='read_file(file)',globals=globals(),number = 100)
1.6323043460000122
>>> timeit(stmt='hash_md5(file)',globals=globals(),number = 100)
8.137973076999998
>>> timeit(stmt='hash_sha(file)',globals=globals(),number = 100)
7.1260356809999905
>>> timeit(stmt='hash_md5_sha(file)',globals=globals(),number = 100)
13.740918666999988
这个结果应该是一个函数,主脚本将迭代文件列表,并应为不同的文件(从1到4)检查不同的哈希值。 有任何想法如何实现?
concurrent.futures
类中的PoolProcessExecutor()
方法。我相信这将帮助你实现你想要的功能。你可以在这里找到该库的更多详细信息:concurrent.futures。 - undefined