[英]Using joblib makes the program run much slower, why?
我在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
在我的笔记本电脑CPU睿i5-2520M,4个核,64位的Win7,运行时间为6.464s的JOBLIB和0.004s为简单地for
循环。
我已经将参数作为内存映射来防止每个工作人员的重新分配开销。 我已将此红色帖子设为红色,但仍未解决我的问题。 为什么会这样呢? 我是否错过了某些学科以正确使用joblib ?
“许多小任务”不适合Joblib。 任务粒度越粗糙,joblib导致的开销越少,您从中得到的好处就越大。 对于微小的任务,建立工作进程并与之通信数据的成本将超过并行化带来的任何好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.