解开字典词典参数,并在多处理池中使用** kwargs

问题描述 投票:0回答:1

全部!

通常,如果我需要将字典作为参数集传递给函数,一种简单的方法是通过解压缩字典并使用它们。

def some_function(a=0, b=0, **params):
    print(a) # 1
    print(b) # 2

d = {"a":1, "b":2}
some_function(**d)

我正在做一个小项目,这将需要很长时间。因此,我试图使用Multiprocessing来帮助我更快地完成工作。我简化了代码(如下)。

from multiprocessing import Pool
from itertools import repeat
import time

def some_function(n, param1=0, param2=0):
    #some operation on n and **params
    print(n)
    print(param1)

input_k = [i for i in range(1,10,2)]
input_params = {'param1':1, 'param2':1}

if __name__ == '__main__':
    with Pool(16) as p:
        k = p.starmap(some_function, zip(input_k, repeat(input_params)))

############## output ##############
#1
#7
#9
#5
#3
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}
#{'param1': 1, 'param2': 1}

我想在相应的some_functioninput_k上运行该input_params。但是该函数的输出不符合预期。看起来该函数采用了整个input_params字典并将其分配给该函数中的param1

我知道我在将字典传递给函数时没有解压缩字典,但是我不知道该怎么做(zip()不允许我在the input_param上简单地添加“ **”)。我该怎么办?

谢谢!

python-3.x multiprocessing python-multiprocessing kwargs
1个回答
1
投票

我将您的代码修改为:

from multiprocessing import Pool
from itertools import repeat
import time

def some_function(n, param1=0, param2=0):
    #some operation on n and **params
    print(n, param1, param2)

input_k = [i for i in range(1,10,2)]
input_params = {'param1':1, 'param2':1}

if __name__ == '__main__':
    with Pool(16) as p:
        k = p.starmap(some_function,  [[x,*y.values()] for x,y in zip(input_k, repeat(input_params))])

现在工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.