【发布时间】:2021-12-25 22:11:06
【问题描述】:
我需要使用来自标准正态分布的随机数创建许多大型 numpy 数组(4e6、100),我正在努力加快速度。我尝试使用多个内核生成阵列的不同部分,但我没有得到预期的速度提升。是我做错了什么,还是期望以这种方式提高速度是错误的?
from numpy.random import default_rng
from multiprocessing import Pool
from time import time
def rng_mp(rng):
return rng.standard_normal((250000, 100))
if __name__ == '__main__':
n_proc = 4
rngs = [default_rng(n) for n in range(n_proc)]
rng_all = default_rng(1)
start = time()
result = rng_all.standard_normal((int(1e6), 100))
print(f'Single process: {time() - start:.3f} seconds')
start = time()
with Pool(processes=n_proc) as p:
result = p.map_async(rng_mp, rngs).get()
print(f'MP: {time() - start:.3f} seconds')
# Single process: 1.114 seconds
# MP: 2.634 seconds
【问题讨论】:
-
如果你真的得到了 ~2.6 秒的多处理持续时间,这些值我不会抱怨。我在我的 3GHz 10 核 Intel Xeon W 上试过这个,它花了大约 10 秒
-
你也用了4核还是增加了核数?我有一个 i7-6700HQ 2.6GHz 英特尔。问题在于与单进程速度的比较,我不明白为什么多进程更慢。
-
NumPy 实现很可能已经使用了多个内核,因此您只是在增加开销。来自here: "... 但是现在许多架构都有一个 BLAS,它也利用了多核机器。如果你的 numpy/scipy 是使用其中之一编译的,那么 dot() 将被并行计算(如果这更快),而无需您做任何事情。..."
标签: python numpy random parallel-processing multiprocessing