如何使用 StdLib 和 Python 3 在一个范围内并行化迭代?

几天来,我一直在寻找有关此问题的答案,但无济于事。我可能只是不了解那里漂浮的部分,并且multiprocessing模块上的 Python 文档相当大而且我不清楚。


假设您有以下 for 循环:


import timeit



numbers = []


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 seconds

SUM: 4999999950000000

对于此示例,假设您有一个 4 核处理器。有没有办法总共创建 4 个进程,其中每个进程都在一个单独的 CPU 内核上运行,并且完成速度大约快 4 倍,所以 24s/4 个进程 = ~6 秒?


守着星空守着你
浏览 87回答 3
3回答

慕村225694

import timeitfrom multiprocessing import Pooldef appendNumber(x):    return xstart = 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 secondsSUM: 4999999950000000
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python