具有多个关键字参数的函数的 Joblib 并行化

Joblib parallelization of function with multiple keyword arguments

我有一个大而复杂的函数,为了演示目的可以简化为这个原型函数:

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: name 'op' is not defined

我也试过这个:

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: name 'op' is not defined

所以我尝试了这个:

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: too many values to unpack (expected 2)

如何将关键字参数传递给函数。我错过了什么?

您在定义词典时犯了错误

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]}]
))

这也应该有效(注意 args 在列表中没有用星号解包):

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]}]
))