如何在python3.x中为以下嵌套循环应用多处理

时间:2017-07-12 04:15:21

标签: python-3.x python-multiprocessing

for i in range(1,row):
    for j in range(1,col):
        if i > j and i != j:
            x = Aglo[0][i][0]
            y = Aglo[j][0][0]
            Aglo[j][i] = offset.myfun(x,y)
            Aglo[i][j] = Aglo[j][i]

Aglo [] []是一个2D数组,由第一行中的列表组成 offset.myfun()是在别处定义的函数

这可能是一个微不足道的问题,但我无法理解如何对这些嵌套循环使用多处理,因为x,y(在myfun()中使用)对于每个进程都是不同的(如果使用多处理)

谢谢

1 个答案:

答案 0 :(得分:0)

如果我正确读取您的代码,则不会覆盖任何先前计算的值。如果这是真的,那么您可以使用多处理。如果没有,那么您无法保证多处理的结果的顺序正确。

要使用multiprocessing.Pool之类的内容,您需要收集所有有效(x,y)对以传递给offset.myfun()。这样的事情可能有用(未经测试):

pairs = [(i, j, Aglo[0][i][0], Aglo[j][0][0]) for i in range(1, row) for j in range(1, col) if i > j and i != j]
# offset.myfun now needs to take a tuple instead of x, y
# it additionally needs to emit i and j in addition to the return value
# e.g. (i, j, result)
p = Pool(4)
results = p.map(offset.myfun, pairs)
# fill in Aglo with the results
for pair in pairs:
    i, j, value = pair
    Aglo[i][j] = value
    Aglo[j][i] = value

您需要将i和j传递给offset.myfun,否则无法知道哪个结果在哪里。然后offset.myfun应该返回i和j以及结果,这样你就可以适当地填写Aglo。希望这会有所帮助。