关于 python:joblib 并行计算时间

joblib parallel compuction time

Joblib 用于并行计算,njob>1(njob=2 完成需要 12.6 秒)比 njob=1(1.3 秒完成)花费更多时间。我在 16GB RAM 的 mac OSX 10.9 中。我做错了什么吗?这是一个简单的演示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)


简短的回答:Joblib 是一个多处理系统,并且在为 3 个同时作业的每一个启动一个新的 python 进程时有相当多的开销。因此,如果您添加更多作业,您的特定代码可能会变得更慢。

这里有一些关于此的文档。

解决方法不是很好:

  • 接受开销
  • 不要使用并行代码
  • 使用多线程而不是多处理。不幸的是,除非您使用完全编译的函数代替评估,否则很少选择多线程,因为 python 几乎总是单线程的(请参阅 python GIL)。
  • 也就是说,对于需要很长时间的函数,多处理通常是值得的。根据您的应用程序,这确实是一个判断电话。请注意,函数中使用的每个变量都被复制到每个进程中——变量复制在 python 中很少见,所以这可能是一个惊喜。因此,开销部分取决于显式或隐式传递的变量大小(例如,通过使用全局变量)。