跳转至

使用 joblib 实现并行计算

使用 joblib 实现简单的并行计算。

并行运行函数耗时

这篇帖子介绍了使用 Python Multiprocessing 多进程并行计算。本文使用 joblib 实现简单的并行计算。

查看 CPU 数量

  • 使用 multiprocessing:
Python
import multiprocessing

multiprocessing.cpu_count()
  • 使用 joblib:
Python
import joblib

joblib.cpu_count()

串行运行函数

Python
def single(a):
    """定义一个简单的函数"""
    time.sleep(1)  # 休眠 1s
    print(a)  # 打印出 a

直接使用for 循环运行函数 10 次,需要花 10 秒:

Python
import time

start = time.time()  # 记录开始的时间
for i in range(10):  # 执行 10 次 single() 函数
    single(i)
Time = time.time() - start  # 计算执行的时间
print("一共耗时" + str(Time) + "s")

并行运行函数

Python
from joblib import Parallel, delayed

start = time.time()  # 记录开始的时间
Parallel(n_jobs=5)(delayed(single)(i * 3) for i in range(10))  # 并行化处理
Time = time.time() - start  # 计算执行的时间
print("一共耗时" + str(Time) + "s")

并行运行函数耗时

  • 一共耗时 2.76 秒。这是由于同时运行 5 次函数,总共运行 10 次,一共花了 2 轮时间。
  • 并且,函数的打印结果也是每 5 个同时打印出来的。
  • n_jobs的值为 1 时,即相当于for循环的顺序执行,结果仍然会是 10 秒。
  • n_jobs的值为 -1 时,会使用所有的 CPU。
  • n_jobs的值为其它负值时,会使用所有的 CPU 数量减去n_jobs。例如一共有 8 个 CPU,则n_jobs=-2意味着使用 8-2=6 个 CPU。
  • n_jobs=-1时,使用所有的 CPU 执行并行计算。
  • n_jobs=1时,就不会使用并行代码,即等同于顺序执行,可以在 debug 情况下使用。
  • n_jobs<-1时,将会使用n_cpus + 1 + n_jobs个 CPU,例如n_jobs=-2时,将会使用n_cpus-1个 CPU 核,其中n_cpus为 CPU 核的数量。
  • n_jobs=None的情况等同于n_jobs=1

评论