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

m9_*_*psy 29 python serialization python-3.x

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

import _pickle as pickle
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 41

如果可用,pickle模块已经导入_pickle.它是pickle模块的C优化版本,透明使用.

pickle.py源代码:

# Use the faster _pickle if possible
try:
    from _pickle import *
except ImportError:
    Pickler, Unpickler = _Pickler, _Unpickler
Run Code Online (Sandbox Code Playgroud)

并从pickle模块文档:

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

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

  • 所以python3 pickle == python2 cPickle? (12认同)
  • @ m9_psy:的确如此. (3认同)
  • @Moberg:你得到了纯Python实现.使用`try:import cPickle as pickle`,`除ImportError:import pickle`,使用C-accelerated实现(如果可用). (2认同)

roi*_*ppi 8

什么是新的Python 3.0文档的库更改部分:

Python 2.x中的一个常见模式是在纯Python中实现一个模块版本,并将可选的加速版本实现为C扩展; 例如,picklecPickle.这会导致导入加速版本的负担,并在这些模块的每个用户上回退到纯Python版本.在Python 3.0中,加速版本被认为是纯Python版本的实现细节.用户应始终导入标准版本,该版本尝试导入加速版本并回退到纯Python版本.的pickle/ cPickle对接收的这种治疗.配置文件模块位于3.1的列表中.该StringIO模块已经变成了io模块中的一个类.

由于它是一个python约定,实现细节以下划线为前缀,cPickle因此成为了_pickle.值得注意的是,这意味着如果您正在导入_pickle,那么API没有保证合同,并且可能在未来的python3版本中破坏向后兼容性,尽管不太可能.