joblib
是一个用于并行计算和函数缓存的 Python 库。它的 delayed
函数是一个非常有用的工具,可以让你简单地实现任务并行。delayed
函数的主要用途是将一个普通的函数转换为一个延迟计算的任务,以便与 Parallel
一起运行,实现并行处理。
以下是使用 joblib
的 delayed
和 Parallel
进行并行处理的详细示例:
基本示例
我们将定义一个简单的函数用于计算,并使用 delayed
和 Parallel
让这个函数在多个输入上并行运行。
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)
详细说明
compute_square
函数:
- 这是一个简单的计算平方的函数,我们使用
time.sleep
模拟一些计算开销。
delayed
函数:
delayed
函数将compute_square
包装成一个延迟任务。- 每个调用
delayed
都返回一个任务对象,该对象将在Parallel
中执行。
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
(默认)、threading
或multiprocessing
。 - 缓存结果:通过
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)
通过缓存,重复运行相同参数的计算将从缓存中获取结果,大大提高计算效率。