繁体   English   中英

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

[英]What difference between pickle and _pickle in python 3?

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

import _pickle as pickle

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

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

来自pickle.py源代码

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

并从pickle模块文档

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

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

什么是新的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版本中破坏向后兼容性,尽管可能性不大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM