python - 在多处理中共享列表列表

标签 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 

我认为原因与多处理的工作原理有关;它需要复印原始 list ,进行工作并返回。这应该是我的情况下多处理速度非常慢的主要原因。 这是我的问题: 1- 在进程之间共享时,我应该如何对 z_reg 执行相同的功能? 2-它是否增强了性能。 3-还有其他想法如何将某些内容附加到 z_reg 中的每个子列表吗?

最佳答案

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

关于python - 在多处理中共享列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51272280/

相关文章:

python - 在函数中使用时,列表推导中不需要方括号

python访问列表中的第二个到最后一个元素

Python 装饰器? - 有人可以解释一下吗?

python - 如何根据列值的长度过滤数据框行

Python 在池映射中使用列表/多个参数

python - 如何将数组的数组转换为简单数组?

python-3.x - 检查列表中的项目是否在列表类型的列中可用

python-3.x - 如何在 python 中使用多处理加速循环执行

python - SQLite 使用多处理读取,而不启动 imap

python - 支持单个字符串和数组作为一个参数