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

时间:2019-06-04 17:52:50

标签: python python-3.x python-multiprocessing

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

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

未并行化的示例:

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

返回:

CPU times: user 8.13 s, sys: 1.04 s, total: 9.17 s
Wall time: 9.21 s

我的词典是正确的

print([mydict[i] for i in range(10)])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

我尝试并行化:

%%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)))

返回:

TypeError: square() missing 1 required positional argument: 'i'

预期结果是正确的字典,但是时间大约是9.21秒的1/4。

1 个答案:

答案 0 :(得分:1)

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

iterable = [(argA1, argB1), (argA2, argB2) ...]

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

pool.starmap(square, zip(itertools.repeat(d), range(20)))