首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python多进程列表字典

Python多进程列表字典
EN

Stack Overflow用户
提问于 2018-02-10 19:28:42
回答 1查看 669关注 0票数 2

我需要在Python3.6的多进程中做一些事情。也就是说,我必须更新一个添加对象列表的字典。因为这些对象是不可拾取的,所以我需要使用dill而不是pickle,从pathos使用multiprocess而不是multiprocessing,但这不应该是问题所在。

向字典添加列表需要在向字典添加之前重新序列化列表。这会减慢一切,并且所需的时间与没有多处理时相同。你能给我推荐一种解决方法吗?

这是我用Python3.6编写的代码:init1工作但很慢,init2很快但坏了。其余部分仅用于测试目的。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-11 02:19:52

使用管道的可能解决方案。在我的pc上,这需要870ms,相比之下,1.10s的test1和200ms的test2

代码语言:javascript
复制
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,我得到:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48720252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档