几天来,我一直在寻找有关此问题的答案,但无济于事。我可能只是不了解那里漂浮的部分,并且multiprocessing模块上的 Python 文档相当大而且我不清楚。假设您有以下 for 循环:import timeitnumbers = []start = timeit.default_timer()for num in range(100000000): numbers.append(num)end = timeit.default_timer()print('TIME: {} seconds'.format(end - start))print('SUM:', sum(numbers))输出:TIME: 23.965870224497916 secondsSUM: 4999999950000000对于此示例,假设您有一个 4 核处理器。有没有办法总共创建 4 个进程,其中每个进程都在一个单独的 CPU 内核上运行,并且完成速度大约快 4 倍,所以 24s/4 个进程 = ~6 秒?
3 回答
慕村225694
TA贡献1880条经验 获得超4个赞
import timeit
from multiprocessing import Pool
def appendNumber(x):
return x
start = timeit.default_timer()
with Pool(4) as p:
numbers = p.map(appendNumber, range(100000000))
end = timeit.default_timer()
print('TIME: {} seconds'.format(end - start))
print('SUM:', sum(numbers))
所以,Pool.map就像内置map功能。它接受一个函数和一个可迭代对象,并生成对可迭代对象的每个元素调用该函数的结果列表。在这里,由于我们实际上不想更改范围可迭代中的元素,因此我们只返回参数。
关键是Pool.map将提供的可迭代对象(range(1000000000)此处)分成块并将它们发送到它拥有的进程数(此处定义为 4 in Pool(4)),然后将结果重新加入一个列表中。
运行时我得到的输出是
TIME: 8.748245699999984 seconds
SUM: 4999999950000000
添加回答
举报
0/150
提交
取消