2014-10-01 57 views
0

我跟隨F Sebastian的答案; 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) 

我想要的東西,更像是從迭代工具的第一個元素:

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

所以我function_star有這樣一個說法轉換成三人。

+0

我想你想壓扁元組。你可以看看這個[前](http://stackoverflow.com/questions/18500541/how-to-flatten-a-tuple-in-python)問題來獲得一些想法。讓我知道這是否適合你。 – 2014-10-01 11:41:21

回答

1

我覺得它更容易使用functools.partial而不是itertools.repeat的固定參數。然後你只需拉上你的可變參數,並將其傳遞給func_star這需要兩個固定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 
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

這是不是有點複雜? – 2014-10-01 11:55:35

+0

是的,同意!但它展示瞭如何將Navanod提供的'參數'轉換爲平面列表的方式。 – pm007 2014-10-01 12:15:18

0

爲什麼要使用itertools在所有?

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