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

时间:2014-06-24 09:15:01

标签: python performance parallel-processing 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

在配备i5-2520M CPU,4核,Win7 64bit的笔记本电脑上,joblib的运行时间 6.464s ,简单for的运行时间 0.004s 循环。

我已将参数作为内存映射,以防止每个worker重新分配的开销。 我已经红了这个亲戚post,仍然没有解决我的问题。 为什么会这样?我是否错过了一些正确使用 joblib 的学科?

1 个答案:

答案 0 :(得分:3)

"许多小任务"不适合joblib。任务粒度越粗,joblib导致的开销越少,从中获得的好处就越多。对于微小的任务,设置工作进程和向它们传递数据的成本将超过并行化带来的任何好处。