一、joblib 库概述
joblib 是 Python 生态中轻量且高效的工具库,核心用于对象序列化、模型持久化、并行计算,尤其适配大数据对象与机器学习场景。其原理是优化 pickle 序列化逻辑,支持大数组分块存储,借助多进程实现并行加速。优点是轻量无依赖、读写速度快、内存占用低、并行接口简洁;缺点是不适合跨语言使用,复杂自定义对象兼容性有限。该库采用 BSD 开源许可证,可自由商用与修改。

二、joblib 安装方法
joblib 安装无需复杂环境配置,支持 pip 与 conda 两种安装方式,适配所有主流 Python 版本与操作系统。
1. pip 安装(推荐)
打开命令行工具,执行以下命令即可完成安装:
pip install joblib
2. conda 安装
若使用 Anaconda 或 Miniconda 环境,可执行:
conda install -c anaconda joblib
安装完成后,在 Python 脚本中直接导入即可使用,无额外配置步骤:
import joblib
print(joblib.__version__)
执行后输出版本号,即代表安装成功。
三、joblib 核心功能与代码实例
joblib 核心功能分为两大模块:对象持久化(dump/load)、并行计算(Parallel/delayed),同时提供内存缓存、压缩存储等辅助功能,覆盖日常开发与机器学习全场景。
3.1 基础对象持久化:dump 与 load
序列化与反序列化是 joblib 最基础的功能,替代原生 pickle 模块,针对 numpy 数组、pandas 数据框、机器学习模型做了深度优化,读写速度远超 pickle,且支持大文件分块存储。
3.1.1 基础数据类型存储与读取
演示存储列表、字典、数值等基础数据类型:
import joblib
# 定义测试数据
data_list = [1, 2, 3, 4, 5]
data_dict = {"name": "joblib教程", "version": 1.3, "function": ["序列化", "并行计算"]}
number = 100
# 序列化保存数据
joblib.dump(data_list, "data_list.pkl")
joblib.dump(data_dict, "data_dict.pkl")
joblib.dump(number, "number.pkl")
# 反序列化读取数据
load_list = joblib.load("data_list.pkl")
load_dict = joblib.load("data_dict.pkl")
load_number = joblib.load("number.pkl")
print("读取列表:", load_list)
print("读取字典:", load_dict)
print("读取数值:", load_number)
代码说明:joblib.dump(对象, 保存路径) 用于将 Python 对象写入文件,joblib.load(文件路径) 用于读取文件还原对象,操作逻辑与 pickle 一致,但底层优化更适合大数据对象。
3.1.2 压缩存储
joblib 支持直接存储压缩文件,节省磁盘空间,支持 gzip、bz2、xz 三种压缩格式,只需在文件名后缀标注即可:
import joblib
import numpy as np
# 生成大型 numpy 数组
big_array = np.random.rand(10000, 1000)
# 压缩存储为 gzip 格式
joblib.dump(big_array, "big_array.gz", compress=("gzip", 3))
# compress 参数可指定压缩等级,范围 0-9,数值越大压缩率越高,速度越慢
# 读取压缩文件
load_array = joblib.load("big_array.gz")
print("压缩后数组形状:", load_array.shape)
print("数组占用内存:", load_array.nbytes / 1024 / 1024, "MB")
代码说明:大数据对象直接存储会占用大量磁盘空间,使用压缩存储可减少 50%-90% 空间,joblib 读取时会自动解压,无需手动处理。
3.1.3 多对象合并存储
joblib 支持一次性存储多个对象,读取时按顺序还原,适合批量保存相关数据:
import joblib
# 定义多个对象
obj1 = [1, 2, 3]
obj2 = {"a": 1, "b": 2}
obj3 = "joblib多对象存储"
# 合并存储
joblib.dump([obj1, obj2, obj3], "multi_obj.pkl")
# 批量读取
load_obj1, load_obj2, load_obj3 = joblib.load("multi_obj.pkl")
print(load_obj1)
print(load_obj2)
print(load_obj3)
代码说明:将多个对象放入列表中统一存储,读取时按存储顺序解包,简化多文件管理逻辑。
3.2 机器学习模型持久化
joblib 诞生初衷就是为了解决机器学习模型存储问题,是 scikit-learn 官方推荐的模型保存工具,完美适配决策树、随机森林、逻辑回归、SVM 等模型。
import joblib
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据集并划分训练集测试集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
# 训练随机森林模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
# 保存训练好的模型
joblib.dump(model, "iris_rf_model.pkl")
# 加载模型并预测
load_model = joblib.load("iris_rf_model.pkl")
predict = load_model.predict(X_test)
print("预测结果:", predict[:5])
print("模型准确率:", load_model.score(X_test, y_test))
代码说明:机器学习模型训练耗时较长,使用 joblib 保存后,下次直接加载即可预测,无需重新训练,极大提升开发效率。
3.3 并行计算:Parallel 与 delayed
原生 Python 多进程代码繁琐,joblib 封装了 Parallel 与 delayed 装饰器,一行代码实现多进程并行,大幅提升循环任务执行速度。
3.3.1 基础并行任务
import time
import joblib
from joblib import Parallel, delayed
# 定义单任务函数
def task_func(x):
time.sleep(1)
return x * x
# 串行执行
start = time.time()
serial_result = [task_func(i) for i in range(8)]
print("串行耗时:", time.time() - start, "秒")
# 并行执行(4进程)
start = time.time()
parallel_result = Parallel(n_jobs=4)(delayed(task_func)(i) for i in range(8))
print("并行耗时:", time.time() - start, "秒")
print("并行结果:", parallel_result)
代码说明:n_jobs 指定进程数,设置为 -1 表示使用 CPU 全部核心,delayed 用于包装需要并行执行的函数,并行执行时间随进程数增加显著缩短。
3.3.2 带参数的并行任务
from joblib import Parallel, delayed
def calc_func(a, b, power):
return (a + b) ** power
# 多参数并行执行
result = Parallel(n_jobs=2)(delayed(calc_func)(i, i+1, 2) for i in range(5))
print("多参数并行结果:", result)
代码说明:delayed 可传递任意数量参数,适配复杂业务函数,无需修改函数本身逻辑。
3.3.3 并行进度显示
处理大量任务时,可通过 verbose 参数显示执行进度:
from joblib import Parallel, delayed
import time
def long_task(x):
time.sleep(0.5)
return x
# 显示进度
result = Parallel(n_jobs=3, verbose=10)(delayed(long_task)(i) for i in range(20))
代码说明:verbose 数值越大,进度输出越详细,方便监控长时间并行任务的执行状态。
3.4 内存缓存:Memory
joblib 提供内存缓存功能,缓存函数执行结果,重复调用时直接读取缓存,避免重复计算,适合耗时较长的函数。
import joblib
import time
# 创建缓存目录
memory = joblib.Memory(location="cache_dir", verbose=0)
# 装饰器缓存函数
@memory.cache
def slow_calculate(n):
time.sleep(2)
return sum(range(n+1))
# 第一次执行:计算并缓存
start = time.time()
print(slow_calculate(10000))
print("第一次执行耗时:", time.time() - start, "秒")
# 第二次执行:直接读取缓存
start = time.time()
print(slow_calculate(10000))
print("第二次执行耗时:", time.time() - start, "秒")
代码说明:函数参数不变时,直接返回缓存结果,参数变化时重新计算,自动管理缓存文件,无需手动清理。
四、实际综合案例:机器学习模型训练与批量预测
结合 joblib 序列化、并行计算功能,实现完整的机器学习模型保存、加载、批量预测流程。
import joblib
import numpy as np
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from joblib import Parallel, delayed
# 1. 加载数据并训练模型
digits = load_digits()
X, y = digits.data, digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = SVC()
model.fit(X_train, y_train)
# 2. 保存模型
joblib.dump(model, "digits_svc_model.pkl")
print("模型保存成功")
# 3. 加载模型
load_model = joblib.load("digits_svc_model.pkl")
# 4. 并行批量预测
def predict_single(idx):
sample = X_test[idx:idx+1]
return load_model.predict(sample)[0]
# 并行预测前100个样本
predict_result = Parallel(n_jobs=-1)(delayed(predict_single)(i) for i in range(100))
print("批量预测结果:", predict_result[:10])
# 5. 保存预测结果
joblib.dump(predict_result, "predict_result.pkl")
print("预测结果保存成功")
案例说明:该案例覆盖 joblib 三大核心功能,模型持久化避免重复训练,并行预测提升推理速度,结果序列化方便后续分析,是工业级项目常用开发模式。
相关资源
- Pypi地址:https://pypi.org/project/joblib/
- Github地址:https://github.com/joblib/joblib
- 官方文档地址:https://joblib.readthedocs.io/
关注我,每天分享一个实用的Python自动化工具。
