我跟随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已将这一个参数转换为三个。
答案 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')]