Python 如何同时计算多个哈希?

Python 如何同时计算多个哈希?,python,multithreading,hash,md5,sha,Python,Multithreading,Hash,Md5,Sha,我想计算同一文件的多个哈希值,并通过多处理节省时间 据我所见,从ssd读取文件的速度相对较快,但哈希计算的速度几乎是ssd的4倍。如果我想计算2个不同的散列(md5和sha),速度要慢8倍。我希望能够在不同的处理器内核上并行计算不同的哈希值(最多4个,取决于设置),但不明白如何绕过GIL 这是我当前的代码(hash.py): 我做了一些测试,结果如下: from hash import * from timeit import timeit timeit(stmt='read_file(file

我想计算同一文件的多个哈希值,并通过多处理节省时间

据我所见,从ssd读取文件的速度相对较快,但哈希计算的速度几乎是ssd的4倍。如果我想计算2个不同的散列(md5和sha),速度要慢8倍。我希望能够在不同的处理器内核上并行计算不同的哈希值(最多4个,取决于设置),但不明白如何绕过GIL

这是我当前的代码(
hash.py
):

我做了一些测试,结果如下:

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
。我已经做了一些基准测试,最有效的方法是使用
ProcessPoolExecutor
。以下是一个例子:

executor=ProcessPoolExecutor(4)
executor.map(散列函数、文件)
执行器关闭()
如果您想查看我的基准测试,您可以找到它们和结果:

Total using read_file: 10.121980099997018
Total using hash_md5_sha: 40.49621040000693
Total (multi-thread) using read_file: 6.246223400000417
Total (multi-thread) using hash_md5_sha: 19.588415799999893
Total (multi-core) using read_file: 4.099713300000076
Total (multi-core) using hash_md5_sha: 14.448464199999762

我使用了40个文件(每个文件有300个MiB)进行测试。

您可以使用
concurrent.futures
类中的
PoolProcessExecutor()
方法。我相信这将帮助你实现你想要的。您可以在这里找到该库的更多详细信息:谢谢您的回复和代码示例。我对SSD的测试结果看起来很有希望,但在慢速介质上进行的相同测试实际上更慢:我猜这里的问题是,外部HDD上的随机访问导致了较低的平均读取速度。除了并行散列计算外,还有什么方法可以执行顺序读取?我的结果是:正如我所知,散列算法通常不会以并行方式进行计算。您可以尝试使用更快的散列库(据我所知,hashlib非常慢),也可以使用承诺异步操作的文件I/O库。你可以在这里找到一个例子:,但我没有测试它。我知道计算单个散列不应该从并行处理中受益,但同时计算多个散列不是问题,对吗?我最初的想法是在两个不同的线程中同时计算sha和md5散列(如果需要更多的散列,则可以计算更多的线程),但我不明白如何实现它。我想我需要用多处理模块启动2个(或更多)python进程,并以某种方式与它们交换数据?或者为此创建一个C库并将其绑定到python?
Total using read_file: 10.121980099997018
Total using hash_md5_sha: 40.49621040000693
Total (multi-thread) using read_file: 6.246223400000417
Total (multi-thread) using hash_md5_sha: 19.588415799999893
Total (multi-core) using read_file: 4.099713300000076
Total (multi-core) using hash_md5_sha: 14.448464199999762