Как применить многопроцессорность в python3.x для следующего вложенного цикла
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[][] - это двумерный массив, состоящий из списков в первой строке offset. Myfun () - это функция, определенная в другом месте.
Это может быть тривиальный вопрос, но я не мог понять, как использовать многопроцессорность для этих вложенных циклов, так как x,y (используется в myfun ()) отличается для каждого процесса (если используется многопроцессорность)
Спасибо
1 ответ
Если я правильно читаю ваш код, вы не перезаписываете ранее вычисленные значения. Если это правда, то вы можете использовать многопроцессорность. Если нет, то вы не можете гарантировать, что результаты многопроцессорной обработки будут в правильном порядке.
Чтобы использовать что-то вроде 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
Вам нужно будет перейти в я и J, чтобы offset.myfun
потому что в противном случае нет никакого способа узнать, какой результат идет куда. offset.myfun
должен затем вернуть i и j вместе с результатом, чтобы вы могли заполнить Aglo соответствующим образом. Надеюсь это поможет.