在多处理中共享列表列表

时间:2018-07-10 18:54:35

标签: python python-3.x python-multiprocessing

我想提高代码的效率。我的代码的重点部分是将元素追加到列表列表中。基本上,我想做以下事情,

import multiprocessing
import time
def update_val(L, i):  
    L.append(i**2)
    return L

if __name__ == "__main__":
    N = 1000000
    x_reg = [list(range(10)) for i in range(N)]
    y_reg = [list(range(10)) for i in range(N)]
    z_reg = [list(range(10)) for i in range(N)]   
    "Regular Call"
    start = time.time()
    [x_reg[i].append(i**2)  for i in range(N)]
    stat_reg =time.time() - start

    "Multiprocessing"
    num_cores = multiprocessing.cpu_count() # equals 4 in my case
    pool = multiprocessing.Pool(num_cores)
    start = time.time()
    y_reg = pool.starmap(update_val,[(y_reg[i],i) for i in range(N)])
    pool.close()
    pool.join()
    stat_val =time.time() - start


    print("Regular: %g "%(stat_reg))
    print("Mult.: %g "%(stat_val))

输出为:

Regular: 0.387984 
Mult.: 2.54244 

我认为原因与多处理的工作方式有关;它需要制作一份原始清单的副本,请员工进行工作并将其退还。这应该是我的情况下多处理速度非常慢的主要原因。 这是我的问题: 1-在进程之间共享时,如何执行与z_reg相同的功能? 2-是否提高了性能。 3-还有其他想法如何在z_reg的每个子列表中附加内容吗?

1 个答案:

答案 0 :(得分:1)

我建议您使用multiprocessing.Queue。将列表保留在主流程中,并通过队列从所有子流程中发送数据。