繁体   English   中英

使用joblib会使程序运行慢得多,为什么?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM