joblib 并行计算时间
使用Joblib进行并行计算时,当设置的njob大于1时,反而花费的时间更长。比如,njob=2时需要12.6秒完成,而njob=1时只需要1.3秒。我现在使用的是mac OSX 10.9,内存有16GB。我是不是哪里做错了?下面是一个简单的演示代码:
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)
1 个回答
1
简单来说,Joblib 是一个可以让你同时运行多个任务的工具,但每次启动一个新的 Python 进程时会消耗不少资源。因此,如果你同时运行三个任务,可能会导致你的代码变得更慢,如果你再增加更多任务的话。
关于这个工具的详细信息可以在这里找到。
解决这个问题的方法并不理想:
- 接受这种资源消耗。
- 不使用并行代码。
- 使用多线程,而不是多进程。不过,使用多线程的机会不多,因为 Python 通常是单线程的(可以看看 Python 的全局解释器锁 GIL)。
不过,对于那些需要很长时间才能完成的任务来说,多进程通常是值得的。具体要看你的应用场景,这需要你自己判断。需要注意的是,函数中使用的每个变量都会被复制到每个进程中——在 Python 中,变量复制是比较少见的,所以这可能会让人感到意外。因此,资源消耗在一定程度上取决于传递的变量的大小,无论是显式传递还是隐式传递(比如使用全局变量)。