构建函数的元组参数

时间:2014-10-01 11:27:44

标签: python multiprocessing

我跟随F塞巴斯蒂安的回答; Python multiprocessing pool.map for multiple arguments使用多处理来计算函数。我在参数输入中积累起来,我希望我对function_star的固定输入是' 1',' 2'而变化的输入' x'并且' y',当我尝试以下内容时:

args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))

我得到以下内容:

  

(' x',(' 1',' 2'))   (' y',(' 1',' 2'))

但是我想加入itertools中的元组,以便我可以发送给:

pool.map(func_star, args)

我喜欢的东西更类似于itertools的第一个元素:

('x', '1', '2')...

所以我的function_star已将这一个参数转换为三个。

3 个答案:

答案 0 :(得分:1)

我认为使用functools.partial而不是itertools.repeat更容易使用固定参数。然后你只需压缩你的变量参数并将它们传递给func_star,它需要两个固定的args,然后是一个变量args的元组:

import multiprocessing
from functools import partial

def func(a, b, c, d):
   print("{} {} {} {}".format(a, b, c, d))

def func_star(a, b, c_d):
   func(a, b, *c_d)

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    partfunc = partial(func_star, '1', '2') # '1' and '2' are the fixed args
    var_list1 = ['a', 'b', 'c']
    var_list2 = ['x', 'y', 'z']
    pool.map(partfunc, zip(var_list1, var_list2))

输出:

1 2 a x
1 2 b y
1 2 c z

答案 1 :(得分:0)

您可以尝试使用itertools.chain.from_iterable来展平您的列表。

示例(我在嵌套列表中调用链两次..):

args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))
itertools.chain.from_iterable( itertools.chain.from_iterable( args ) )
<itertools.chain object at 0x26F7E7F0>
list( _ )
['x', '1', '2', 'y', '1', '2']

第二个例子(不确定你想要实现的目标):

args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))
[ list( itertools.chain.from_iterable( arg ) ) for arg in args ]
[['x', '1', '2'], ['y', '1', '2']]

答案 2 :(得分:0)

为什么要使用itertools?

>>> fixed = ("1", "2")
>>> variant = ("x", "y")
>>> argsgen = ((v,) + fixed for v in variant)
>>> list(argsgen)
[('x', '1', '2'), ('y', '1', '2')]