2017-02-08 68 views
3

我有以下代码,我想加快(使用多处理)。在Python中多处理循环

def main(arg1): 
    data=[] 
    #Calculate new argument arg2 
    for i in range(n): 
     data.append(function(z,i,arg2)) 

其中z在2D数组中。 我的想法是以如下方式做,但我不确定这会加速这个过程。

from multiprocessing import Pool 
import itertools 

def function_star(a_b_c): 
    return function(*a_b_c) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 
    out=pool.map(function_star, i, itertools.repeat(z),itertools.repeat(arg2)) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

这确实是加速过程最有效的方法吗?

回答

1

如果我正确地解释你的代码块你想拥有function调用总是相同的z,并arg1i是一个范围(我有点不确定,因为你贴的代码将无法正常工作,因为map只需要一个迭代和你给予3)

如果是这种情况,那么partial解决您的问题:

from multiprocessing import Pool 
from functools import partial 

def function(i, z, arg2): 
    print(z, i, arg2) 

def main(arg1): 
    #Calculate new argument arg2 
    pool=Pool() 
    i=range(n) 

    out=pool.map(partial(function, z=5, arg2=3), i) 
    pool.close() 

if __name__=="__main__": 
    main(arg1) 

注意,您需要让不断变化的0改变你的函数的参数的顺序参数处于第一位置。

如果你关心速度,你应该添加第三个参数到map chunksize。这使得进程要求主进程中的chunksize数据包,以便主进程和子进程之间的通信数量更少。