python 3中的pickle和_pickle有什么区别?

时间:2013-10-04 22:40:26

标签: python serialization python-3.x

我是python的新手,想要实现快速对象序列化。我试图使用json,但它太慢了,也试图使用马歇尔模块,但是由马歇尔序列化的对象大小比pickle多6-7倍,所以我决定在我的项目中使用pickle。我读到了关于cPickle模块,读得很快,但是在python 3中没有这样的模块,docs说名为_pickle的模块是用C语言编写的。所以在我的项目中我使用

import _pickle as pickle

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

2 个答案:

答案 0 :(得分:41)

pickle模块导入_pickle(如果有)。它是pickle模块的C优化版本,透明使用。

来自pickle.py source code

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

来自pickle module documentation

  

pickle模块具有用C编写的透明优化器(_pickle)。只要可用,它就会被使用。否则使用纯Python实现。

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

答案 1 :(得分:8)

来自Library Changes文档的What's New In Python 3.0部分:

  

Python 2.x中的常见模式是拥有一个版本的模块   在纯Python中实现,带有可选的加速版本   实现为C扩展;例如,picklecPickle。这个   放入加速版本和下降的负担   回到这些模块的每个用户的纯Python版本。在   Python 3.0,加速版本被认为是实现   纯Python版本的详细信息。 用户应始终导入   标准版本,它试图导入加速版本和   回到纯Python版本。 pickle / cPickleStringIO / cPickle   接受了此处理。配置文件模块位于3.1的列表中。   _pickle模块已经变成了io模块中的一个类。

由于这是一个python约定,实现细节以下划线为前缀,_pickle变为{{1}}。值得注意的是,这意味着如果您要导入{{1}},则API无法保证合同,并且可以在未来的python3版本中向后兼容,这可能不太可能。