需要帮助并行Python中的循环(Need help to parallelize a loop i

2019-09-18 13:53发布

我有一个巨大的数据集,我必须来计算它的每一个点的一系列特性。 我的代码是很慢,我想使它更快并列化莫名其妙DO循环。 我想每个处理器来计算“一系列属性”为我的数据的一个子样本有限,然后在一个阵列一起加入的所有属性。 我会试着解释一下我有一个例子做。

比方说,我的数据集的阵列x

x = linspace(0,20,10000)

在“属性”我希望得到的是,例如,平方根x

prop=[]
for i in arange(0,len(x)):
    prop.append(sqrt(x[i]))

现在的问题是我怎么能并行上面的循环? 假设我有4个处理器,我想他们每个人来计算10000/4 = 2500点的开方。

我试图寻找像一些Python模块multiprocessingmpi4py而是从引导我找不到答案,这样一个简单的问题。

EDITS

我要感谢大家的宝贵意见和你为我提供的链接。 不过,我想澄清我的问题。 我不感兴趣的sqrt函数任何责任。 我做一个循环内的一系列操作。 我完全知道循环不好和矢量操作总是最好他们,但在这种情况下,我真的要做一个循环。 我不会去到我的问题的细节,因为这会增加不必要的复杂性这个问题。 我想,这样每个处理器做它的一部分分裂我的循环,这意味着我可以运行我的代码40次,每次循环,合并结果的1/40,但是这将是愚蠢的。 这是一个简单的例子

     for i in arange(0,len(x)):
         # do some complicated stuff

我要的是用40级的CPU来做到这一点:

    for npcu in arange(0,40):
       for i in arange(len(x)/40*ncpu,len(x)/40*(ncpu+1)):
          # do some complicated stuff

那是可能的,或者不使用Python?

Answer 1:

我不知道,这是你应该做的事情,我期望numpy的,以有绕了一个更有效的方法的方式,但你只是意思是这样的?

import numpy
import multiprocessing

x = numpy.linspace(0,20,10000)
p = multiprocessing.Pool(processes=4)

print p.map(numpy.sqrt, x)

下面是结果timeit两个解决方案。 作为@SvenMarcach指出,然而,与更昂贵的功能多会开始更加有效。

% python -m timeit -s 'import numpy; x=numpy.linspace(0,20,10000)' 'prop=[]                                                                          
for i in numpy.arange(0,len(x)):
         prop.append(numpy.sqrt(x[i]))'
10 loops, best of 3: 31.3 msec per loop

% python -m timeit -s 'import numpy, multiprocessing; x=numpy.linspace(0,20,10000)
p = multiprocessing.Pool(processes=4)' 'l = p.map(numpy.sqrt, x)' 
10 loops, best of 3: 102 msec per loop

在斯文的请求,这里的结果是l = numpy.sqrt(x)其是比任一替代方案的显著更快。

% python -m timeit -s 'import numpy; x=numpy.linspace(0,20,10000)' 'l = numpy.sqrt(x)'
10000 loops, best of 3: 70.3 usec per loop


Answer 2:

并行化是不平凡的,但你可能会发现numexpr有用。

对于数字的工作 ,你真的应该看看numpy的给你(公用事业矢量化和类似的),这会给你通常是一个好加速的基础上工作。

对于较复杂的,非数值的情况下 ,你可以使用multiprocessing (见注释)。


在阿里纳斯,多线程比其他语言更加不平凡的Python,是CPython中具有全局解释器锁(GIL) ,其不允许的Python代码两段在同一时间在同一个解释器运行(即有没有真正的多线程纯Python代码)。 对于I / O和重计算,第三方库却倾向于释放锁,使有限的多线程是可能的。

这增加了通常的多线程滋扰具有互斥共享数据存取和类似的。



Answer 3:

我建议你看一看用Cython: http://www.cython.org/

它使您能够真正快速创建蟒蛇C扩展,并与numpy的整合得非常好。 这里是一个很好的教程,可以帮助你开始: http://docs.cython.org/src/tutorial/numpy.html



文章来源: Need help to parallelize a loop in python