pickle、dill 和 jobli总结

在 Python 中,pickledill 和 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]

三者的主要区别总结

特性pickledilljoblib
Python 内置 ✅ 是 ❌ 需安装 ❌ 需安装
支持复杂对象 ❌ 不支持 lambda、生成器等 ✅ 支持 ❌ 主要用于 NumPy/ML
存储效率 一般 一般 ✅ 更高(适合大数据)
加载速度 一般 较慢 ✅ 更快(并行优化)
主要用途 通用 Python 对象 复杂 Python 对象 机器学习/大数据

如何选择?

  1. 通用 Python 对象 → pickle(标准库,兼容性好)。

  2. 需要保存 lambda、动态函数、类定义等 → dill(兼容性最强)。

  3. 机器学习模型或 NumPy 大数据 → joblib(速度最快)。

如果是 scikit-learn 模型,官方推荐 joblib;如果是 PyTorch 动态计算图,可能需要 dill

posted @ 2025-07-02 17:39  郭慕荣  阅读(81)  评论(0)    收藏  举报