我需要运行一个令人尴尬的并行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不仅提高了速度,而且使它变慢了?我是不是错过了什么,谢谢
发布于 2018-11-19 17:00:43
Joblib创建新的进程来运行您想要并行执行的函数。但是,创建进程可能需要一些时间(大约500ms),特别是现在fork使用spawn创建新进程(而不是joblib )。
因为您想要并行运行的函数运行速度非常快,所以这里的%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.34shttps://stackoverflow.com/questions/48349980
复制相似问题