Joblib распараллеливание функции с несколькими аргументами ключевых слов - PullRequest
1 голос
/ 14 апреля 2020

У меня есть большая и сложная функция, которая может быть уменьшена до этой функции-прототипа для демонстрационных целей:

def test(a, b, op="", ex=[]):
    print(op)
    ex = len(ex)
    if op=='add':
        return a+b+ex
    elif op=='mult':
        return (a*b)+ex
    elif op=='div':
        return (a%b)+ex
    else:
        return -1

Я пытался запустить две работы в этой функции параллельно с возможными различными аргументами ключевого слова, связанными с ними. Я могу работать с такими аргументами, если бы не было аргументов ключевых слов:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args)
    for args in (
        [1, 2],
        [101, 202]
    ))

Для передачи аргументов ключевых слов я подумал об этом:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
    for args, kwargs in (
        [1, 2, op='div'],
        [101, 202, op='sum', ex=[1,2,9]]
    ))

Но, очевидно, это должно привести к некоторой синтаксической ошибке на op='div' часть. Я также попробовал это:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
    for *args, kwargs in (
        [1, 2, {op: 'div'}],
        [101, 202, {op:'sum', ex:[1,2,9]}]
    ))

Но тогда это покажет эту ошибку:

NameError: имя 'op' не определено

I также пробовал это:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
    for args, kwargs in (
        [(1, 2), {op: 'div'}],
        [(101, 202), {op:'sum', ex:[1,2,9]}]
    ))

Та же ошибка:

NameError: имя 'op' не определено

Итак, я попробовал это:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
    for args,kwargs in (
        [1, 2, {'op': 'div'}],
        [101, 202, {'op':'sum', 'ex':[1,2,9]}]
    ))

Теперь я получаю это:

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

Как передать аргументы ключевого слова в функция. Чего мне не хватает?

1 Ответ

1 голос
/ 14 апреля 2020

Вы ошиблись в определении своих словарей

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
for *args, kwargs in (
    [1, 2, {'op': 'div'}],
    [101, 202, {'op':'sum', 'ex':[1,2,9]}]
))

Это также должно работать (обратите внимание, что аргументы в списке не распакованы со звездочкой):

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args, **kwargs)
for args, kwargs in (
    [(1, 2), {'op': 'div'}],
    [(101, 202), {'op':'sum', 'ex':[1,2,9]}]
))
...