[英]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.