【问题标题】:Python multiprocess dict of list列表的Python多进程字典
【发布时间】:2018-07-21 01:48:13
【问题描述】:

我需要在 Python 3.6 的多进程中做一些事情。即,我必须更新一个添加对象列表的字典。由于这些对象是不可选择的,我需要使用dill 而不是picklepathos 中的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


【解决方案1】:

使用管道的可能解决方案。在我的电脑上,这需要 870 毫秒,而 test1 需要 1.10 秒,test2 需要 200 毫秒。

def init3(child_conn):
    d = {}
    for i in range(1000):
        l = []
        for k in range(i):
            l.append(i)
        d[i] = l
    child_conn.send(d)

def test3():
    import multiprocess as mp
    parent_conn, child_conn = mp.Pipe(duplex=False)
    p = mp.Process(target=init3, args=(child_conn,))
    p.start()
    d = parent_conn.recv()
    p.join()

在 jupyter 上,通过使用魔法 %timeit 我得到:

In [01]: %timeit test3()
872 ms ± 11.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [02]: %timeit test2()
199 ms ± 1.72 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [03]: %timeit test1()
1.09 s ± 10.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2014-10-15
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多