nn0*_*n0p 3 python parallel-processing performance multiprocessing
我有很多很多小任务要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
Run Code Online (Sandbox Code Playgroud)
在我的带有 i5-2520M CPU、4 核、Win7 64 位的笔记本电脑上,joblib 的运行时间为 6.464秒,简单循环的运行时间为0.004秒。for
我已经将参数作为内存映射,以防止每个工人重新分配的开销。我已经红色了这个相关的帖子,仍然没有解决我的问题。为什么会这样?我是否错过了一些正确使用joblib 的学科?
“许多小任务”不适合 joblib。任务粒度越粗,joblib 导致的开销越小,您从中获得的好处就越多。对于小任务,设置工作进程和与它们通信数据的成本将超过并行化带来的任何好处。