我正在尝试对具有恒定参数以及可变参数的函数进行多处理。
我尝试创建一个大的可迭代对象,该常量将常量参数附加到变化的参数上,并将其传递给Pool.starmap(),但这似乎很麻烦。
from multiprocessing import Pool
import itertools
def combine_iterables(foo, bar, iterable_list):
foobar = (foo, bar)
arg_list = list(itertools.product(*iterable_list))
for i in range(len(arg_list)):
arg_list[i] = foobar+arg_list[i]
return arg_list
# Returns [('foo', 'bar', 10, 140), ('foo', 'bar', 10, 150)...]
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
p = Pool()
data = p.starmap(
func,
combine_iterables(foo,bar,iterable_list)
)
p.close()
p.join()
def func(foo, bar, small, big):
#Do Stuff
此方法有效,但感觉确实很乱,我想知道是否有更好的方法?
答案 0 :(得分:2)
您可以使用functools.partial
创建一个为其他函数提供默认参数的函数:
from functools import partial
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
with Pool() as p:
data = p.starmap(partial(func, foo, bar), product(*iterable_list))
答案 1 :(得分:1)
使用functools.partial
from multiprocessing import Pool
import itertools
import functools
def func(foo, bar, small, big):
return [foo, bar, small, big]
def process(foo, bar, small=[10,20,30], big=[140, 150, 160]):
iterable_list = [small,big]
p = Pool()
data = p.starmap(
functools.partial(func, foo, bar),
itertools.product(*iterable_list)
)
p.close()
p.join()
print(data)
if __name__ == '__main__':
process('foo', 'bar')