【发布时间】:2018-07-21 01:48:13
【问题描述】:
我需要在 Python 3.6 的多进程中做一些事情。即,我必须更新一个添加对象列表的字典。由于这些对象是不可选择的,我需要使用dill 而不是pickle 和pathos 中的multiprocess 而不是multiprocessing,但这应该不是问题。
向字典添加列表需要在添加到字典之前重新序列化列表。这会减慢一切,并且与没有多处理所需的时间相同。你能建议我一个解决方法吗?
这是我使用 python 3.6 编写的代码:
init1 工作但慢,init2 快但坏了。其余仅用于测试目的。
import time
def init1(d: dict):
for i in range(1000):
l = []
for k in range(i):
l.append(k)
d[i] = l
def init2(d: dict):
for i in range(1000):
l = []
d[i] = l
for k in range(i):
l.append(i)
def test1():
import multiprocess as mp
with mp.Manager() as manager:
d = manager.dict()
p = mp.Process(target=init1, args=(d,))
p.start()
p.join()
print(d)
def test2():
import multiprocess as mp
with mp.Manager() as manager:
d = manager.dict()
p = mp.Process(target=init2, args=(d,))
p.start()
p.join()
print(d)
start = time.time()
test1()
end = time.time()
print('test1: ', end - start)
start = time.time()
test2()
end = time.time()
print('test2: ', end - start)
【问题讨论】:
-
可能不相关,但我认为你可能会因为嵌套循环都使用
i而冒着遇到错误的风险 - 和d[i]在这里不清楚。 -
@match 这只是为了测试,如果你想改变它:)
-
init2还引用了未在该方法中定义的l。请将此代码修复为您正在测试的代码,并在init1中明确您想要的内容@ -
查看循环的细微差别和结果的主要差别,这里:eval.in/953752
-
已修复,抱歉输出量大,需要突出时间差异
标签: python python-3.x shared-memory python-multiprocessing dill