使用支持您想要支持读取数据的最低 Python 版本的最新协议。较新的协议版本支持新的语言功能并包括优化。
来自pickle模块数据格式文档 https://docs.python.org/3/library/pickle.html#data-stream-format:
目前有 6 种不同的协议可用于酸洗。使用的协议越高,读取生成的 pickle 所需的 Python 版本就越新。
- 协议版本 0 是原始的“人类可读”协议,并且向后兼容早期版本的 Python。
- 协议版本 1 是一种旧的二进制格式,也与早期版本的 Python 兼容。
- 协议版本 2 是在 Python 2.3 中引入的。它提供了更有效的酸洗新式课堂 https://docs.python.org/3/glossary.html#term-new-style-class。参考PEP 307 https://www.python.org/dev/peps/pep-0307有关协议 2 带来的改进的信息。
- Python 3.0 中添加了协议版本 3。它有明确的支持bytes https://docs.python.org/3/library/stdtypes.html#bytes对象并且不能被 Python 2.x 解封。这是 Python 3.0–3.7 中的默认协议。
- Python 3.4 中添加了协议版本 4。它增加了对非常大的对象的支持,腌制更多种类的对象,以及一些数据格式优化。它是从 Python 3.8 开始的默认协议。参考PEP 3154 https://www.python.org/dev/peps/pep-3154有关协议 4 带来的改进的信息。
- Python 3.8 中添加了协议版本 5。它增加了对带外数据的支持和对带内数据的加速。参考PEP 574 https://www.python.org/dev/peps/pep-0574有关协议 5 带来的改进的信息。
并从[pickle.Pickler(...)
班级部分](
可选的protocol参数,一个整数,告诉pickler使用给定的协议;支持的协议为 0 到HIGHEST_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.HIGHEST_PROTOCOL。如果没有指定,则默认为DEFAULT_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.DEFAULT_PROTOCOL。如果指定负数,HIGHEST_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.HIGHEST_PROTOCOL被选中。
因此,当您想支持使用Python 3.4或更高版本加载pickled数据时,请选择协议4。如果您仍需要支持Python 2.7,请选择协议2,尤其如果您使用的是派生自的自定义类object
(新式类)(现在任何现代代码都会这样做)。
但是,如果您要与其他 Python 版本交换 pickled 数据,或者需要保持与旧 Python 版本的向后兼容性,最简单的方法是坚持使用您可以掌握的最高协议版本:
with open("prot2", 'wb') as pfile:
pickle.dump(d, pfile, protocol=pickle.HIGHEST_PROTOCOL)
pickle.HIGHEST_PROTOCOL
始终是当前 Python 版本的正确版本。因为这是二进制格式,所以请确保使用'wb'
作为文件模式!
Python 3 不再区分cPickle
and pickle
,始终使用pickle
当使用 Python 3 时。它在底层使用编译的 C 扩展。
如果您仍在使用 Python 2,那么cPickle
and pickle
大部分是兼容的,区别在于提供的API。对于大多数用例,只需坚持cPickle
;它更快。引用文档 https://docs.python.org/2/library/pickle.html#module-cPickle again:
First, cPickle
可以比 pickle 快 1000 倍,因为前者是用 C 实现的。 其次,在cPickle
模块可调用对象Pickler()
and Unpickler()
是函数,而不是类。这意味着您不能使用它们来派生自定义 pickling 和 unpickling 子类。大多数应用程序不需要此功能,并且应该受益于大大提高的性能cPickle
module.