2010-12-16 44 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]