Python joblib performance



我需要运行一个令人尴尬的并行 for 循环。经过快速搜索,我找到了python的包joblib。我做了一个简单的测试,如包装网站上发布的那样。这是测试

from math import sqrt
from joblib import Parallel, delayed
import multiprocessing 
%timeit [sqrt(i ** 2) for i in range(10)]
result: 3.89 µs ± 38.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
num_cores = multiprocessing.cpu_count()
%timeit Parallel(n_jobs=num_cores)(delayed(sqrt)(i ** 2) for i in range(10))
result: 600 ms ± 40 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

如果我正确理解了结果,使用 joblib 不仅会增加速度,还会变慢速度?我在这里错过了什么,谢谢

Joblib创建新进程来并行运行要执行的函数。但是,创建进程可能需要一些时间(大约 500 毫秒(,尤其是现在 joblib 使用spawn来创建新进程(而不是fork(。

因为要并行运行的函数运行速度非常快,所以这里%timeit的结果主要显示进程创建的开销。如果您选择的函数在与启动新进程所需的时间相比不可忽略的时间内运行,您将看到性能的一些改进:

下面是可以运行以对此进行测试的示例:

import time
import joblib
from joblib import Parallel, delayed

def f(x):
    time.sleep(1)
    return x

def bench_joblib(n_jobs):
    start_time = time.time()
    Parallel(n_jobs=n_jobs)(delayed(f)(x) for x in range(4))
    print('running 4 times f using n_jobs = {} : {:.2f}s'.format(
        n_jobs, time.time()-start_time))

if __name__ == "__main__":
    bench_joblib(1)
    bench_joblib(4)

我得到了,使用 python 3.7 和 joblib 0.12.5

running 4 times f using n_jobs = 1 : 4.01s
running 4 times f using n_jobs = 4 : 1.34s

最新更新