我正在尝试加速一些只能运行单线程的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的四分之一。
发布于 2019-06-05 03:17:17
如果目标函数有多个参数,则需要pool.starmap()
。.starmap()
将解包并将iterable
中的参数元组映射到目标函数的参数。iterable
-parameter需要此布局才能与.starmap()
一起使用
iterable = [(argA1, argB1), (argA2, argB2) ...]
使用itertools.repeat()
复制标量的引用,如您的d
,并使用zip()
创建可迭代的参数元组
pool.starmap(square, zip(itertools.repeat(d), range(20)))
https://stackoverflow.com/questions/56449046
复制相似问题