Python 3中pickle和_pickle有什么区别?

35

我是Python的新手,希望实现快速对象序列化。我尝试使用JSON,但是它太慢了,还试图使用marshall模块,但是由marshall序列化的对象大小比pickle大6-7倍,所以我决定在我的项目中使用pickle。我了解了cPickle模块,并了解到它非常快,但是Python 3中没有这样的模块,文档说模块名为_pickle并且是用C编写的。因此,在我的项目中我使用pickle。

import _pickle as pickle

pickle和_pickle之间有什么区别?我该如何实现更快的对象序列化/反序列化?

2个回答

61

pickle模块 已经 导入了_pickle,如果可用的话。它是pickle模块的C优化版本,并且可以透明地使用。

来自pickle.py源代码:

# Use the faster _pickle if possible
try:
    from _pickle import *
except ImportError:
    Pickler, Unpickler = _Pickler, _Unpickler

以下内容摘自pickle模块文档

pickle模块有一个透明的优化器(_pickle)由C编写。每当可用时,它就会被使用。否则,就会使用纯Python实现。

在Python 2中,_pickle被称为cPickle,但已经更新以允许作为一项实现细节的透明使用。


18
Python3中的pickle与Python2中的cPickle是等价的吗? - m9_psy
1
请注意,在Python 3中直接导入_pickle是不必要的,而且它缺少一些功能,比如.HIGHEST_PROTOCOL常量。 - Michael Scott Asato Cuthbert
如果我在Python 2.7.6中执行import pickle,我会得到哪个实现? - Moberg
4
你可以使用纯Python实现,使用try: import cPickle as pickleexcept ImportError: import pickle语句,在可用时使用C加速实现。 - Martijn Pieters
1
@MartijnPieters 快速回答,谢谢!所以在过渡期间,我可以使用try/except ImportError来支持Python2和Python3的C实现。 - Moberg

12

以下是Python 3.0新特性文档中的库变更部分:

在Python 2.x中,一种常见的模式是将一个模块的一个版本实现为纯Python,另外一个可选的加速版本则实现为C扩展;例如,pickle和cPickle。这将把导入加速版本并回退到纯Python版本的负担放在这些模块的每个用户身上。在Python 3.0中,加速版本被认为是纯Python版本的实现细节。用户应该始终导入标准版本,它尝试导入加速版本并回退到纯Python版本。pickle / cPickle对已经接受了这种处理。profile模块在3.1的列表中。StringIO模块已被转换为io模块中的一个类。
由于Python约定实现细节以下划线开头,因此cPickle变成了_pickle。值得注意的是,这意味着如果您正在导入_pickle,则API没有保证的合同,并且在未来的python3发布中可能会破坏向后兼容性,尽管这种情况很少发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接