joblib 是一个用于并行计算和函数缓存的 Python 库。它的 delayed 函数是一个非常有用的工具,可以让你简单地实现任务并行。delayed 函数的主要用途是将一个普通的函数转换为一个延迟计算的任务,以便与 Parallel 一起运行,实现并行处理。

以下是使用 joblibdelayedParallel 进行并行处理的详细示例:

基本示例

我们将定义一个简单的函数用于计算,并使用 delayedParallel 让这个函数在多个输入上并行运行。

python
from joblib import Parallel, delayed
import time

# 定义一个示例函数
def compute_square(x):
    time.sleep(0.5)  # 模拟计算延迟
    return x ** 2

# 使用 `delayed` 将函数包装为延迟执行的任务
tasks = [delayed(compute_square)(i) for i in range(10)]

# 使用 `Parallel` 并行运行所有任务
results = Parallel(n_jobs=4)(tasks)

# 打印结果
print("Results:", results)

详细说明

  1. compute_square 函数
  • 这是一个简单的计算平方的函数,我们使用 time.sleep 模拟一些计算开销。
  1. delayed 函数
  • delayed 函数将 compute_square 包装成一个延迟任务。
  • 每个调用 delayed 都返回一个任务对象,该对象将在 Parallel 中执行。
  1. Parallel 对象
  • Parallel 控制着并行的执行。
  • n_jobs 参数指定同时运行的进程数量。这里我们设为 4。
  • tasks 列表传递给 Parallel,它会并行地执行这些任务,并返回一个结果列表。

扩展示例:处理多参数任务

在实际应用中,你可能需要处理更复杂的函数,比如带有多个参数的函数。在这种情况下,delayed 仍然可以很方便地用于并行化。

python
from joblib import Parallel, delayed
import time

# 多参数函数示例
def compute_power(base, exponent):
    time.sleep(0.5)
    return base ** exponent

# 使用 delayed 包装多参数函数
tasks = [delayed(compute_power)(i, 2) for i in range(10)]

# 使用 Parallel 进行并行执行
results = Parallel(n_jobs=3)(tasks)

print("Results:", results)

进一步扩展

  • 参数调整:可以调整 n_jobs 参数以适应你的 CPU 核心数量。
  • 错误处理Parallel 支持错误处理,可以通过 backend 参数指定不同的并行库,比如 loky(默认)、threadingmultiprocessing
  • 缓存结果:通过 joblib 还可以进行结果缓存以提高重复计算的效率。
python
from joblib import Memory, Parallel, delayed
import os

# 定义缓存目录
cache_dir = os.path.join(os.getcwd(), 'cache')
memory = Memory(location=cache_dir, verbose=0)

# 被缓存的函数
@memory.cache
def compute_square_cached(x):
    time.sleep(0.5)
    return x ** 2

# 使用 delayed 和 Parallel 并行运行
tasks = [delayed(compute_square_cached)(i) for i in range(10)]
results = Parallel(n_jobs=4)(tasks)

print("Cached Results:", results)

通过缓存,重复运行相同参数的计算将从缓存中获取结果,大大提高计算效率。