使用可迭代和可迭代参数多处理函数

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

我试图使用常量参数和不同的参数多处理函数。

我已经尝试创建一个大的iterable,它将常量参数附加到不同的参数并将其传递给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

这种方法有效,但感觉非常混乱,我想知道是否有更好的方法吗?

python
2个回答
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')

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))
© www.soinside.com 2019 - 2024. All rights reserved.