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

Python 具有多个关键字参数的函数的Joblib并行化,python,python-3.x,parallel-processing,joblib,Python,Python 3.x,Parallel Processing,Joblib,我有一个大而复杂的功能,可以简化为这个原型功能进行演示: 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 我一

我有一个大而复杂的功能,可以简化为这个原型功能进行演示:

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
我一直在尝试在这个函数上并行运行两个作业,可能与它们关联的关键字参数不同。如果没有关键字args,我可以使用如下参数运行:

o1, o2 = Parallel(n_jobs=2)(delayed(test)(*args)
    for args in (
        [1, 2],
        [101, 202]
    ))
对于传递关键字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]]
    ))
但显然,它应该在
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]}]
    ))
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]}]
    ))
但这会显示出这个错误:

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]}]
    ))
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]}]
    ))
同样的错误:

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]}]
    ))
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]}]
    ))
现在我明白了:

ValueError:要解压缩的值太多(应为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]}]
))
这也应该起作用(请注意,参数在列表中,未使用星号解包):