#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), и вы можете просто перебирать результаты.