2010-12-16 104 views
11

在Python中,multiprocessing模塊可用於並行運行一系列值的函數。例如,這會產生f的前100000個評估列表。Python多處理函數,具有多個輸入

def f(i): 
    return i * i 

def main(): 
    import multiprocessing 
    pool = multiprocessing.Pool(2) 
    ans = pool.map(f, range(100000)) 

    return ans 

當f需要多個輸入但只有一個變量變化時,可以做類似的事情嗎?例如,你會如何並行的:

def f(i, n): 
    return i * i + 2*n 

def main(): 
    ans = [] 
    for i in range(100000): 
     ans.append(f(i, 20)) 

    return ans 

回答

11

有幾種方法可以做到這一點。在這個問題給出的例子,你可以只定義一個包裝函數

def g(i): 
    return f(i, 20) 

與此包裝傳遞給map()。一個更一般的方法是具有一個包裝,需要一個單個元組參數,並解包元組多個參數

def g(tup): 
    return f(*tup) 

或使用等效lambda表達式:lambda tup: f(*tup)

-3

你可以用窮人的柯里(又名把它包):

new_f = lambda x: f(x, 20) 

然後調用new_f(i)

+3

Thils將* not *與多處理映射一起工作,因爲它不支持不可導入的函數(使用pickle工具) – Lagerbaer 2013-05-22 19:30:27

21

您可以使用functools.partial

def f(i, n): 
    return i * i + 2*n 

def main(): 
    import multiprocessing 
    pool = multiprocessing.Pool(2) 
    ans = pool.map(functools.partial(f, n=20), range(100000)) 

    return ans 
3

如果你用我的multiprocessing叉,叫pathos,你可以使用多個參數的游泳池......走也lambda功能。關於它的好處是你不必改變你的編程結構以適應並行工作。

>>> def f(i, n): 
... return i * i + 2*n 
... 
>>> from itertools import repeat 
>>> N = 10000 
>>> 
>>> from pathos.pools import ProcessPool as Pool 
>>> pool = Pool() 
>>> 
>>> ans = pool.map(f, xrange(1000), repeat(20)) 
>>> ans[:10] 
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121] 
>>> 
>>> # this also works 
>>> ans = pool.map(lambda x: f(x, 20), xrange(1000)) 
>>> ans[:10] 
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121]