首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python joblib性能

Python joblib性能
EN

Stack Overflow用户
提问于 2018-01-20 05:43:57
回答 1查看 943关注 0票数 1

我需要运行一个令人尴尬的并行for循环。经过快速搜索,我找到了python的joblib包。我做了一个简单的测试,就像在包的网站上发布的一样。下面是测试结果

代码语言:javascript
复制
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不仅提高了速度,而且使它变慢了?我是不是错过了什么,谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-11-19 17:00:43

Joblib创建新的进程来运行您想要并行执行的函数。但是,创建进程可能需要一些时间(大约500ms),特别是现在fork使用spawn创建新进程(而不是joblib )。

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

下面是一个示例,您可以运行它来测试这一点:

代码语言:javascript
复制
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

代码语言:javascript
复制
running 4 times f using n_jobs = 1 : 4.01s
running 4 times f using n_jobs = 4 : 1.34s
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48349980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档