【发布时间】:2021-09-02 13:55:52
【问题描述】:
我正在尝试学习如何在 Python 中使用 multiprocessing 包,我编写了以下代码,它随机生成一个大型二维数组,然后计算出每行中有多少个数字在指定的间隔内(在这种情况下,介于 4 和 8 之间):
import time
import multiprocessing as mp
import numpy as np
def how_many_within_range(row, minimum, maximum):
count = 0
for n in row:
if minimum <= n <= maximum:
count += 1
return count
if __name__ == '__main__':
data = np.random.randint(0, 10, size=[10000000, 5])
print(data[:5])
start_time = time.perf_counter()
# With parallelisation
with mp.Pool(mp.cpu_count()) as pool:
results = [ pool.apply(how_many_within_range, args=(row, 4, 8)) \
for row in data ]
# Without parallelisation
# results = [ how_many_within_range(row, 4, 8) for row in data ]
print(f'Time elapsed: {time.perf_counter() - start_time}')
print(results[:5])
如果没有多处理,代码运行大约需要 40 秒,但是使用它,程序会慢得多,并且不会在实际时间内完成。我很确定我正确地遵循了我正在使用的教程,那么我做错了什么?
【问题讨论】:
-
pool.apply 是一个阻塞调用。使用 pool.apply_async() 并开始并行运行。不过,apply_async 的返回结构有点不同。
标签: python multiprocessing python-multiprocessing