解压字典字典参数,并在多处理池中使用**kwargs
Unpacking a dictionary dictionary parameter, and using **kwargs in mutiprocessing pool
全部!
通常,如果我需要将字典作为参数集传递给函数,一种简单的方法是解压字典并使用它们。
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_function
就对应input_k
和input_params
。但是函数的输出并不像预期的那样。看起来该函数采用整个 input_params
字典并将其分配给函数中的 param1
?
我知道我在将它传递给函数时没有解压字典,但我不知道该怎么做(zip()
不允许我简单地添加“**” the input_param
)。我该怎么做?
谢谢!
我将您的代码修改为:
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))])
现在工作正常。
全部!
通常,如果我需要将字典作为参数集传递给函数,一种简单的方法是解压字典并使用它们。
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_function
就对应input_k
和input_params
。但是函数的输出并不像预期的那样。看起来该函数采用整个 input_params
字典并将其分配给函数中的 param1
?
我知道我在将它传递给函数时没有解压字典,但我不知道该怎么做(zip()
不允许我简单地添加“**” the input_param
)。我该怎么做?
谢谢!
我将您的代码修改为:
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))])
现在工作正常。