我有4个列表,每个浮动3个浮点数。我有两个函数(实际上实现为一个函数 - 一个不同的int参数更改它所作用的列表的元素),我想并行运行。它们都采用所有列表并使用它们来进行一些计算。第一个函数的结果 - 4个浮点数 - 每个列表一个 - 用于更改每个列表的第二个元素,而第二个函数的结果用于更改所有lsits中的第三个元素。然后我想继续下一次迭代,其中函数执行相同但使用更新的列表(所有列表中的第一个元素保持不变)。
代表我的想法的简单代码
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()
因此,对于nstep的下一个值,我希望函数使用列表的更新版本及其在上一次迭代中计算的值。我觉得我对此完全错误
答案 0 :(得分:0)
这是没有多处理的代码。在使用l1_copy1=list(l1)
处理列表之前,您需要复制列表。然后,您可以合并来自new_l1=[l1_copy1[0], l1_copy2[1], l1[2]]
等两个函数的修改后的列表。
另一个评论;使用matrice或创建一个类matrice来保存列表,这样你就可以遍历它们。
l1 = [1,2,3]
l2 = [4,5,6]
l3 = [7,8,9]
l4 = [10,11,12]
def increment_at_position_k(l1, l2, l3, l4, k):
l1, l2, l3, l4 = list(l1), list(l2), list(l3), list(l4) # copy lists (otherwise the list is modified directly)
l1[k] += 1
l2[k] += 1
l3[k] += 1
l4[k] += 1
return (l1, l2, l3, l4, k)
for iterations in [0]:
results = []
for i in [1,2]:
ret = increment_at_position_k(l1, l2, l3, l4, i)
results.append(ret)
for res in results:
local_l1, local_l2, local_l3, local_l4, k = res # unpack result
#update global list
l1[k] = local_l1[k]
l2[k] = local_l2[k]
l3[k] = local_l3[k]
l4[k] = local_l4[k]
print l1
print l2
print l3
print l4