33

我是 python 新手,想实现快速的对象序列化。我尝试使用json,但是太慢了,也尝试使用marshall模块,但是marshall序列化的对象大小是pickle的6-7倍,所以我决定在我的项目中使用pickle。我读到了 cPickle 模块,读起来很快,但是在 python 3 中没有这样的模块,文档说名为 _pickle 的模块是用 C 编写的。所以在我的项目中我使用

import _pickle as pickle

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

4

2 回答 2

52

如果可用,该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)。它在可用时使用。否则使用纯 Python 实现。

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

于 2013-10-04T22:43:21.253 回答
10

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 未来版本中的向后兼容性,尽管这种可能性不大。

于 2013-10-04T22:43:32.397 回答