具有多个关键字参数的函数的 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]}]
))
我有一个大而复杂的函数,为了演示目的可以简化为这个原型函数:
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]}]
))