使用joblib为何使程序运行得更慢?
我有很多小任务需要在一个 for
循环中完成。我想用并发来加快速度。我选择了 joblib,因为它很容易集成。不过,我发现使用 joblib 让我的程序运行得比简单的 for
循环慢得多。下面是示例代码:
import time
import random
from os import path
import tempfile
import numpy as np
import gc
from joblib import Parallel, delayed, load, dump
def func(a, i):
'''a simple task for demonstration'''
a[i] = random.random()
def memmap(a):
'''use memory mapping to prevent memory allocation for each worker'''
tmp_dir = tempfile.mkdtemp()
mmap_fn = path.join(tmp_dir, 'a.mmap')
print 'mmap file:', mmap_fn
_ = dump(a, mmap_fn) # dump
a_mmap = load(mmap_fn, 'r+') # load
del a
gc.collect()
return a_mmap
if __name__ == '__main__':
N = 10000
a = np.zeros(N)
# memory mapping
a = memmap(a)
# parfor
t0 = time.time()
Parallel(n_jobs=4)(delayed(func)(a, i) for i in xrange(N))
t1 = time.time()-t0
# for
t0 = time.time()
[func(a, i) for i in xrange(N)]
t2 = time.time()-t0
# joblib time vs for time
print t1, t2
在我的笔记本电脑上,配置是 i5-2520M CPU,4 核心,Win7 64位,使用 joblib 的运行时间是 6.464秒,而简单的 for
循环只需要 0.004秒。
我已经把参数设置为内存映射,以防止每个工作线程重新分配内存时的开销。我看过这篇相关的 帖子,但问题仍然没有解决。为什么会这样呢?我是不是漏掉了什么使用 joblib 的规则?
1 个回答
6
“很多小任务”并不适合用joblib这个工具。任务越粗大,joblib带来的额外负担就越小,你能得到的好处就越多。如果任务太小,设置工作进程和传输数据的成本会超过你从并行处理中得到的好处。