2014-03-25 69 views
1

为njob> 1(njob = 2需要12.6s完成)花费更多时间的Joblib比njob = 1(1.3s完成)需要更多时间。我在Mac OSX 10.9中使用16GB RAM。我是否犯了一些错误?下面是一个简单的演示代码:joblib并行计算时间

from joblib import Parallel, delayed 
def func(): 
    for i in range(200): 
     for j in range(300): 
      yield i, j 

def evaluate(x): 
    i=x[0] 
    j=x[1] 
    p=i*j 
    return p, i, j 

if __name__ == '__main__': 
    results = Parallel(n_jobs=3, verbose=2)(delayed(evaluate)(x) for x in func()) 
    res, i, j = zip(*results) 
+0

另请参阅:http://stackoverflow.com/questions/21027477/joblib-parallel-multiple-cpus-slower-than-single 已经给出了这个问题的全面答案。 –

回答

1

简短的回答:JOBLIB是一个多处理系统,并具有开销为每个3个同时工作的启动了一个新的Python进程会比较大。因此,如果添加更多作业,您的特定代码可能会变得更慢

有一些关于这个here的文档。

的解决方法是不是很大:

  1. 接受的开销
  2. 不使用并行代码
  3. 使用multithreading,而不是多处理..不幸的是,多线程是很少的选择,除非你正在使用一个完全编译函数代替评估,因为python几乎总是单线程的(请参阅python GIL)。

也就是说,对于需要很长时间的函数,多处理往往是值得的。取决于您的应用程序,这确实是一个判断呼叫。请注意,函数中使用的每个变量都被复制到每个进程 - python中的变量副本很少见,所以这可能是一个惊喜。因此,开销部分是显式或隐式传递的变量大小的函数(例如,通过使用全局变量)。