dill:扩展 Python pickle 的序列化库
2026/6/8 1:24:11 网站建设 项目流程

文章目录

  • dill:扩展 Python pickle 的序列化库
    • 核心能力:覆盖更多类型
    • 与 pickle 的关系
    • 使用方式
    • 适用场景

dill:扩展 Python pickle 的序列化库

dill 是一个基于 pickle 的 Python 序列化库,由 UQ Foundation 维护。它继承了 pickle 的接口设计,同时扩展了对更多 Python 内置类型的支持。目前该项目在 GitHub 上获得了约 2,440 个 Star。

核心能力:覆盖更多类型

Python 标准库中的 pickle 模块已经能够处理常见的数据类型,但面对某些特殊对象时会受限。dill 的目标是尽可能覆盖 Python 的内置类型体系。

它支持序列化的标准类型包括:None、type、bool、int、float、complex、bytes、str、tuple、list、dict、file、buffer、builtin、Python 类、namedtuple、dataclass、元类、类实例、set、frozenset、array、函数、异常等。

对于一些更特殊的类型,dill 也能处理:含 yield 的生成器函数、嵌套函数、lambda 表达式、cell、method、module、code 对象、methodwrapper、dictproxy、slice、ellipsis 等。

目前仍不支持的类型有 frame、generator 和 traceback。这个覆盖范围在同类工具中已经相当全面。

与 pickle 的关系

dill 的设计定位是 pickle 的增强替代品。用户可以直接用import dill as pickle来替换现有代码中的 pickle 引用,无需改动其他逻辑。

除了扩展类型覆盖范围,dill 还增加了几个 pickle 不具备的能力:

保存和恢复完整的 Python 解释器会话状态。用户可以在一个会话中执行大量操作,用 dill 保存当前环境,之后在新环境中恢复并继续工作。这对需要长时间运行的计算任务比较有用。

提取函数和类的源代码。通过dill.source模块,可以获取对象对应的源码文本,而不只是序列化后的字节流。

诊断序列化错误。dill 提供了dill.detect.trace()上下文管理器,可以输出对象被序列化时的内部步骤树,帮助定位某个类型为什么无法被正确序列化。

使用方式

安装命令:

pip install dill

可选安装诊断工具:

pip install dill[graph] pip install dill[profile]

基础用法与 pickle 完全一致:

fromdillimportdumps,loads squared=lambdax:x**2loads(dumps(squared))(3)# 返回 9

dill 提供了几个关键参数来控制序列化行为:

byref=True 时,模块等对象按引用序列化,而非直接嵌入对象内容,序列化结果更小。

recurse=True 时,递归追踪全局字典中的引用对象,而非直接存储整个全局字典。

fmode 参数控制文件对象的序列化策略:HANDLE_FMODE 只保存句柄,CONTENTS_FMODE 保存文件内容,FILE_FMODE 同时保存两者。跨机器传输时通常需要选择 CONTENT_FMODE 或 FILE_FMODE。

这些参数也可以在dill.settings中全局设置,避免每次调用都重复指定。

适用场景

dill 的主要用途是将 Python 对象转为字节流后在网络中传输。相比 pickle,它的优势在于能序列化 lambda、嵌套函数等 pickle 无法处理的对象类型。在分布式计算框架中,这类需求很常见。

另一个典型场景是保存和恢复解释器会话。数据科学家在交互式环境中运行了一系列探索性分析后,可以用 dill 保存当前命名空间中的所有变量和函数定义,后续直接恢复而无需重新执行。

需要注意的是,dill 和 pickle 一样不保证对恶意构造的数据安全。反序列化来自不可信来源的数据存在风险,使用者需要自行判断数据来源。

dill 要求 Python 3.10 或更高版本。作为 pathos 计算框架的组成部分,它仍在持续维护中。

使用者需要自行判断数据来源。

dill 要求 Python 3.10 或更高版本。作为 pathos 计算框架的组成部分,它仍在持续维护中。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询