首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多处理python for循环并将结果保存为字典

多处理python for循环并将结果保存为字典
EN

Stack Overflow用户
提问于 2019-06-05 01:52:51
回答 1查看 608关注 0票数 1

我正在尝试加速一些只能运行单线程的python代码。我在for循环中运行了其中的许多代码,并希望将其并行化并将结果保存在字典中。

我搜索了堆栈溢出并阅读了multiprocessing文档,但找不到一个好的解决方案。

未并行化的示例:

代码语言:javascript
复制
%%time
# This only uses one thread! It's slow
mydict = {}
for i in range(20000000):
    mydict[i] = i**2

返回:

代码语言:javascript
复制
CPU times: user 8.13 s, sys: 1.04 s, total: 9.17 s
Wall time: 9.21 s

我的字典是正确的

代码语言:javascript
复制
print([mydict[i] for i in range(10)])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

我的并行化尝试:

代码语言:javascript
复制
%%time
import multiprocessing as mp
from multiprocessing import Process, Manager
def square(d, i):
    d[i] = i**2

with mp.Manager() as manager:
    d = manager.dict()
    with manager.Pool(processes=4) as pool:
        pool.map(square, (d, range(20000000)))

返回:

代码语言:javascript
复制
TypeError: square() missing 1 required positional argument: 'i'

预期的结果是正确的字典,但时间大约是9.21的四分之一。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 03:17:17

如果目标函数有多个参数,则需要pool.starmap().starmap()将解包并将iterable中的参数元组映射到目标函数的参数。iterable-parameter需要此布局才能与.starmap()一起使用

代码语言:javascript
复制
iterable = [(argA1, argB1), (argA2, argB2) ...]

使用itertools.repeat()复制标量的引用,如您的d,并使用zip()创建可迭代的参数元组

代码语言:javascript
复制
pool.starmap(square, zip(itertools.repeat(d), range(20)))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56449046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档