繁体   English   中英

列表的Python多进程字典

[英]Python multiprocess dict of list

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

使用管道的可能解决方案。 在我的电脑上,这需要870ms的时间,而test1为1.10s, test2 200ms。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM