Python 使用和修改同一列表对两个函数进行多处理

Python 使用和修改同一列表对两个函数进行多处理,python,multiprocessing,Python,Multiprocessing,我有4个列表,每个列表有3个浮动。我有两个函数(实际上是作为一个函数实现的——不同的int参数改变它所作用的列表的元素),我希望并行运行。他们都会获取所有列表,并使用它们进行一些计算。第一个函数的结果-4个浮点-每个列表一个-用于更改每个列表的第二个元素,而第二个函数的结果用于更改所有LSIT中的第三个元素。然后我想进入下一个迭代,在这里函数做同样的事情,但是使用更新的列表(所有列表中的第一个元素保持不变) 代表我想法的简单代码 l1 = [a,b,c] l2 = [d,e,f] l3 = [g

我有4个列表,每个列表有3个浮动。我有两个函数(实际上是作为一个函数实现的——不同的int参数改变它所作用的列表的元素),我希望并行运行。他们都会获取所有列表,并使用它们进行一些计算。第一个函数的结果-4个浮点-每个列表一个-用于更改每个列表的第二个元素,而第二个函数的结果用于更改所有LSIT中的第三个元素。然后我想进入下一个迭代,在这里函数做同样的事情,但是使用更新的列表(所有列表中的第一个元素保持不变)

代表我想法的简单代码

l1 = [a,b,c]
l2 = [d,e,f]
l3 = [g,h,i]
l4 = [j,k,l]
def func(l1, l2, l3, l4, k):
    do something with the lists on element k of them
    return (x1, x2, x3, x4, k)

pool = multi.Pool(processes = 2)
while nstep <= maxnsteps:
    for i in range(1,3):
        pool.apply_async(func, args = (xval, yval, vxval, vyval, i,))
    nstep = nstep + 1
pool.close()
pool.join()
l1=[a,b,c]
l2=[d,e,f]
l3=[g,h,i]
l4=[j,k,l]
def func(l1、l2、l3、l4、k):
对其中元素k上的列表执行一些操作
返回(x1、x2、x3、x4、k)
pool=multi.pool(进程=2)

而nstep这里是没有多重处理的代码。在使用
l1\u copy1=list(l1)
处理列表之前,您需要复制列表。然后,您可以合并来自两个函数的修改列表,如
new\u l1=[l1\u copy1[0]、l1\u copy2[1]、l1[2]]
等。 另一句话;使用一个矩阵或创建一个类矩阵来保存列表,这样您就可以对它们进行迭代

l1=[1,2,3]
l2=[4,5,6]
l3=[7,8,9]
l4=[10,11,12]
def增量位于位置k(l1、l2、l3、l4、k):
l1,l2,l3,l4=列表(l1),列表(l2),列表(l3),列表(l4)#复制列表(否则直接修改列表)
l1[k]+=1
l2[k]+=1
l3[k]+=1
l4[k]+=1
返回(l1、l2、l3、l4、k)
对于[0]中的迭代:
结果=[]
因为[1,2]中的i:
ret=位置k处的增量(l1、l2、l3、l4、i)
结果追加(ret)
对于结果中的res:
本地_l1,本地_l2,本地_l3,本地_l4,k=res#解包结果
#更新全局列表
l1[k]=本地_l1[k]
l2[k]=局部_l2[k]
l3[k]=本地_l3[k]
l4[k]=局部_l4[k]
打印l1
打印l2
打印l3
打印l4

完成
func
是否需要大量时间?如果不是,用这种方式进行多处理可能比串行代码慢。不多,我一开始是用串行方式进行的,但是maxnsteps是一个非常大的数字,所以我需要一种加速过程的方法-因此我选择了多处理-我甚至不确定这是使用模块的最佳方式,这两个(短)对
func
的调用必须在进入下一个迭代之前完成,才能将问题提交给并发处理。那么您的问题是什么?如果您想知道您的代码是否足够快,请尝试您的方法。但首先问问自己,两倍的提速是否是你想要的(更有可能是低于这个速度)。否则,尝试使用性能分析器优化函数和/或使用pypy而不是python解释器。一些函数获取这些值并同时使用它们进行一些计算,然后每个函数更改列表中的不同值。这是我想要的一个循环的单次迭代-在循环的下一步,他们做同样的事情,但是使用更新的列表和值。有问题的是,每个函数都需要列表中的所有值来进行计算,但随后只更改列表中的一个元素。