使用joblib为何使程序运行得更慢?

4 投票
1 回答
6195 浏览
提问于 2025-04-18 10:52

我有很多小任务需要在一个 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 64位,使用 joblib 的运行时间是 6.464秒,而简单的 for 循环只需要 0.004秒

我已经把参数设置为内存映射,以防止每个工作线程重新分配内存时的开销。我看过这篇相关的 帖子,但问题仍然没有解决。为什么会这样呢?我是不是漏掉了什么使用 joblib 的规则?

1 个回答

6

“很多小任务”并不适合用joblib这个工具。任务越粗大,joblib带来的额外负担就越小,你能得到的好处就越多。如果任务太小,设置工作进程和传输数据的成本会超过你从并行处理中得到的好处。

撰写回答