Python中的多处理,用于具有多个参数的方法

时间:2015-07-01 07:43:49

标签: python numpy multiprocessing compiler-optimization pool

我有大约4000个数据点,我有一个处理它们的程序。尽管我在嵌套循环中使用numpy.arange应用了一些矢量化,但由于程序数量很大,所以程序非常慢。

我搜索了pool.map,问题是它只需要一个参数。我看到这里存在一些问题的答案,Python multiprocessing pool.map for multiple arguments。我使用了最后一个使用map方法和参数列表的方法,我有大约4个args,我将它们放在一个列表中,并使用函数名称传递map方法。在函数中,我从列表中提取了每个参数并执行操作,但它不起作用。这是我调用map的代码,

if __name__ == '__main__':
    pool= Pool(processes=8)
    p= pool.map (kriging1D, [x,v,a,n])
    plt.scatter(x,v,color='red')
    plt.plot(range(5227),p,color='blue')

这是要并行化的功能,

def kriging1D(args):
    x=args[0]
    v=args [1]
    a= args [2]
    n= args [3]
#perform some operations on the args..
...
#return the result.. 

但是,我收到了这个错误,

plt.plot(range(5227),p,color='blue')
NameError: name 'p' is not defined

注意:在添加此行之前,

if __name__ == '__main__':

我收到了这个错误,

RuntimeError: 


Attempt to start a new process before the current process
        has finished its bootstrapping phase.

        This probably means that you are on Windows and you have
        forgotten to use the proper idiom in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce a Windows executable.

这就是我添加if语句的原因。

更多清晰度:v和x是每个大尺寸为4000的向量(两者都具有相同的长度)。我的意图是并行化每个v [i]和x [i]的处理,因此例如一次处理多个v和x元素,而不是逐个处理元素。

有谁能告诉我我在做什么错?或者,建议另一种方法?

谢谢。

2 个答案:

答案 0 :(得分:1)

map()的操作,我因此假设pool.map()(我自己没有用过),如下所示。

依次对每个参数map(myfunc, [1, 2, 3])拨打myfunc来电1, 2, 3myfunc(1),然后是myfunc(2)等。

所以pool.map(kriging1D, [x,v,a,n])相当于调用kriging1D(x),然后调用kriging1D(v),依此类推,不是吗?从您的方法主体看,它似乎您想要做什么。您确定要确实使用pool.map而不是pool.apply吗?

如果我误解了你的问题,我道歉;这不是我的专业领域,但我认为我会尝试和帮助,因为还没有答案。

答案 1 :(得分:1)

您使用的语法适用于** apply *,这是一次调用,而不是批量并行。

>>> from pathos.multiprocessing import ProcessPool as Pool
>>> p = Pool()
>>> 
>>> def do_it(x,y,z):
...   return x+y*z
... 
>>> p.apply(do_it, [2,3,4])
14

如果要使用批量并行,则需要为每个参数提供相同长度的列表。在这里,我正在以5向并行运行3参数函数 - 注意长度为5的列表。

>>> p.map(do_it, range(5),range(5,10),range(0,10,2))
[0, 13, 30, 51, 76]

如果你想使用这种语法,你需要multiprocessing一个名为pathos的分叉(或者还有parmap) - 这两个分支也可以在你链接的SO答案中找到问题。

如果您想使用stdlib multiprocessing,那么您应该查看同一问题中的其他答案。

希望上述内容能澄清这些答案。