pickle、dill 和 jobli总结
在 Python 中,pickle、dill 和 joblib 都是用于对象序列化和反序列化的工具,但它们在功能、性能和应用场景上有显著区别。下面详细解析它们的差异,并提供代码示例。
1. pickle(Python 内置模块)
特点
-
Python 标准库,无需额外安装。
-
支持大多数 Python 对象(如列表、字典、类实例等)。
-
不支持序列化某些特殊对象(如 lambda 函数、生成器、打开的文件句柄等)。
代码示例
保存和加载对象
import pickle
data = {"name": "Alice", "age": 30, "skills": ["Python", "SQL"]}
# 保存到文件
with open("data.pkl", "wb") as f:
pickle.dump(data, f)
# 从文件加载
with open("data.pkl", "rb") as f:
loaded_data = pickle.load(f)
print(loaded_data) # 输出: {'name': 'Alice', 'age': 30, 'skills': ['Python', 'SQL']}
不支持的情况
import pickle
# 尝试序列化 lambda 函数(会报错)
func = lambda x: x * 2
pickle.dump(func, open("lambda.pkl", "wb")) # ❌ PicklingError
2. dill(增强版 pickle)
特点
-
扩展
pickle,支持更多 Python 对象(如 lambda 函数、闭包、生成器、类定义等)。 -
适用于复杂对象的持久化(如 PyTorch 模型、动态定义的函数)。
-
比
pickle稍慢,但兼容性更强。
安装
pip install dill
代码示例
保存和加载 lambda 函数
import dill
func = lambda x: x * 2
# 保存 lambda 函数
with open("lambda_dill.pkl", "wb") as f:
dill.dump(func, f)
# 加载 lambda 函数
with open("lambda_dill.pkl", "rb") as f:
loaded_func = dill.load(f)
print(loaded_func(5)) # 输出: 10
保存和加载类定义
import dill
# 定义一个类
class Person:
def __init__(self, name):
self.name = name
def greet(self):
return f"Hello, {self.name}!"
# 实例化并保存
p = Person("Bob")
with open("person_dill.pkl", "wb") as f:
dill.dump(p, f)
# 加载类实例
with open("person_dill.pkl", "rb") as f:
loaded_p = dill.load(f)
print(loaded_p.greet()) # 输出: Hello, Bob!
3. joblib(优化大数据和机器学习模型)
特点
-
专为 NumPy 数组和大数据优化,比
pickle更快、更节省内存。 -
并行化支持(适合大规模数值计算)。
-
主要用于
scikit-learn模型的保存/加载(.pkl或.joblib格式)。
安装
pip install joblib
代码示例
保存和加载 NumPy 数组
import numpy as np
from joblib import dump, load
# 创建一个大型 NumPy 数组
large_array = np.random.rand(10000, 10000)
# 保存到文件(比 pickle 更快)
dump(large_array, "large_array.joblib")
# 加载数据
loaded_array = load("large_array.joblib")
print(loaded_array.shape) # 输出: (10000, 10000)
保存和加载 scikit-learn 模型
from sklearn.ensemble import RandomForestClassifier
from joblib import dump, load
from sklearn.datasets import load_iris
# 加载数据并训练模型
data = load_iris()
X, y = data.data, data.target
model = RandomForestClassifier().fit(X, y)
# 保存模型
dump(model, "rf_model.joblib")
# 加载模型
loaded_model = load("rf_model.joblib")
print(loaded_model.predict([[5.1, 3.5, 1.4, 0.2]])) # 输出: [0]
三者的主要区别总结
| 特性 | pickle | dill | joblib |
|---|---|---|---|
| Python 内置 | ✅ 是 | ❌ 需安装 | ❌ 需安装 |
| 支持复杂对象 | ❌ 不支持 lambda、生成器等 | ✅ 支持 | ❌ 主要用于 NumPy/ML |
| 存储效率 | 一般 | 一般 | ✅ 更高(适合大数据) |
| 加载速度 | 一般 | 较慢 | ✅ 更快(并行优化) |
| 主要用途 | 通用 Python 对象 | 复杂 Python 对象 | 机器学习/大数据 |
如何选择?
-
通用 Python 对象 →
pickle(标准库,兼容性好)。 -
需要保存 lambda、动态函数、类定义等 →
dill(兼容性最强)。 -
机器学习模型或 NumPy 大数据 →
joblib(速度最快)。
如果是 scikit-learn 模型,官方推荐 joblib;如果是 PyTorch 动态计算图,可能需要 dill。
郭慕荣博客园

浙公网安备 33010602011771号