2016-10-21 2 views
4

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

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 значения с задержкой? Или какое решение вы бы предложили?

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

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 в любом случае, чтобы избежать возможных плохих взаимодействий в реальных сценариях и более низкие представления (?)

ответ

3

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

return (i,j) 

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

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

Теперь приводит список кортежей каждый держит некоторый (I, J), и вы можете просто перебирать результаты.

Смежные вопросы