Python, распараллеливание с помощью joblib: задержка с несколькими аргументами

#python #parallel-processing #delay #joblib

#python #параллельная обработка #задержка #joblib

Вопрос:

Я использую что-то похожее на следующее для распараллеливания цикла for над двумя матрицами

 from joblib import Parallel, delayed
import numpy

def processInput(i,j):
    for k in range(len(i)):
        i[k] = 1
    for t in range(len(b)):
        j[t] = 0
return i,j

a = numpy.eye(3)
b = numpy.eye(3)

num_cores = 2
(a,b) = Parallel(n_jobs=num_cores)(delayed(processInput)(i,j) for i,j in zip(a,b))
  

но я получаю следующую ошибку: слишком много значений для распаковки (ожидается 2)

Есть ли способ вернуть 2 значения с задержкой? Или какое решение вы бы предложили?

Кроме того, немного ОП, есть ли более компактный способ, подобный следующему (который фактически ничего не изменяет) для обработки матриц?

 from joblib import Parallel, delayed
def processInput(i,j):
    for k in i:
        k = 1
    for t in b:
        t = 0
return i,j
  

В любом случае я хотел бы избежать использования has_shareable_memory, чтобы избежать возможных плохих взаимодействий в реальном скрипте и снижения производительности (?)

Ответ №1:

Возможно, слишком поздно, но в качестве ответа на первую часть вашего вопроса: просто верните кортеж в вашей отложенной функции.

 return (i,j)
  

И для переменной, содержащей вывод всех ваших отложенных функций

 results = Parallel(n_jobs=num_cores)(delayed(processInput)(i,j) for i,j in zip(a,b))
  

Теперь результаты представляют собой список кортежей, каждый из которых содержит некоторые (i, j), и вы можете просто перебирать результаты.