字数
757 字
阅读时间
3 分钟
Pickle 是一种 Python 特定的二进制序列化格式。 它允许您将 Python 对象(例如列表、字典、自定义类的实例等)转换为字节流,这个过程称为“pickling”或“封存”。 这个字节流可以被存储在文件中或通过网络传输,之后可以被反序列化(称为“unpickling”或“解封”)以重建原始的 Python 对象。
核心概念:
- 序列化 (Serialization/Pickling): 将 Python 对象层次结构转换为字节流的过程。
- 反序列化 (Deserialization/Unpickling): 将字节流转换回原始 Python 对象层次结构的过程。
Pickle 格式的特点:
- Python 特定: Pickle 格式是为 Python 设计的,这意味着非 Python 程序可能无法正确地重建被 pickle 化的 Python 对象。
- 二进制格式: 与人类可读的文本格式(如 JSON)不同,Pickle 是一种二进制序列化格式。 直接用文本编辑器打开 pickle 文件会显示乱码。
- 支持多种数据类型: Pickle 几乎可以序列化所有的 Python 内置数据类型,并且支持自定义类的实例,这是 JSON 等格式难以做到的。
- 处理复杂对象结构: Pickle 能够跟踪已经被序列化的对象,因此可以正确处理递归对象(引用自身的对)和共享对象(在多处被引用的同一个对象)。
- 版本协议: Pickle 格式随着 Python 的发展而演进,拥有多个版本的协议。较新的协议支持更多的特性和更高效的序列化。
Pickle 的常见用途:
- 保存和加载应用程序状态: 保存程序运行时的状态,以便将来可以恢复。
- 缓存计算结果: 对于耗时的计算,可以将结果 pickle 化并存储起来,避免重复计算。
- 通过网络传输 Python 对象: 在分布式系统或多进程应用中传递 Python 对象。
- 持久化机器学习模型: 保存训练好的机器学习模型是一个非常普遍的用途。
安全警告:
Pickle 模块不是安全的。 从不受信任的来源加载 pickle 数据可能导致执行任意恶意代码。 因此,您只应该解封来自您信任的数据源的数据。 对于处理不受信任的数据,JSON 等更安全的序列化格式是更好的选择。
与 JSON 的比较:
特性 | Pickle | JSON |
---|---|---|
格式 | 二进制 | 文本 |
可读性 | 不可读 | 人类可读 |
互操作性 | Python 特定 | 跨语言通用 |
支持的数据类型 | 几乎所有 Python 对象 | 有限的内置数据类型 |