为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着星空守着你 2021-07-05 08:10:09
几天来,我一直在寻找有关此问题的答案,但无济于事。我可能只是不了解那里漂浮的部分,并且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


查看完整回答
反对 回复 2021-07-06
  • 3 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信