我是python的新手,想要实现快速对象序列化。我试图使用json,但它太慢了,也试图使用马歇尔模块,但是由马歇尔序列化的对象大小比pickle多6-7倍,所以我决定在我的项目中使用pickle。我读到了关于cPickle模块,读得很快,但是在python 3中没有这样的模块,docs说名为_pickle的模块是用C语言编写的。所以在我的项目中我使用
import _pickle as pickle
pickle和_pickle之间有什么区别吗?我如何实现更快的对象序列化/反序列化?
答案 0 :(得分:41)
pickle
模块已导入_pickle
(如果有)。它是pickle
模块的C优化版本,透明使用。
# 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扩展;例如,
pickle
和cPickle
。这个 放入加速版本和下降的负担 回到这些模块的每个用户的纯Python版本。在 Python 3.0,加速版本被认为是实现 纯Python版本的详细信息。 用户应始终导入 标准版本,它试图导入加速版本和 回到纯Python版本。pickle
/cPickle
对StringIO
/cPickle
接受了此处理。配置文件模块位于3.1的列表中。_pickle
模块已经变成了io模块中的一个类。
由于这是一个python约定,实现细节以下划线为前缀,_pickle
变为{{1}}。值得注意的是,这意味着如果您要导入{{1}},则API无法保证合同,并且可以在未来的python3版本中向后兼容,这可能不太可能。