【问题标题】:What difference between pickle and _pickle in python 3?python 3中pickle和_pickle有什么区别?
【发布时间】:2013-10-12 01:54:49
【问题描述】:

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

import _pickle as pickle

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

【问题讨论】:

    标签: python serialization python-3.x


    【解决方案1】:

    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,但已更新为允许透明使用作为实现细节。

    【讨论】:

    • 那么 python3 pickle == python2 cPickle?
    • 请注意,除了不需要在 Python 3 中直接导入 _pickle 之外,它还缺少一些功能,例如 .HIGHEST_PROTOCOL 常量。
    • 如果我在 Python 2.7.6 中使用import pickle,我会得到哪个实现?
    • @Moberg:你得到了纯 Python 实现。使用 try: import cPickle as pickleexcept ImportError: import pickle 来使用 C 加速实现(如果可用)。
    • @MartijnPieters 快速回答,谢谢!所以我可以做一个 try/except ImportError 在过渡期间支持 python2 和 python3 的 C 实现。
    【解决方案2】:

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

    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-09-24
      • 2019-01-28
      • 2020-05-06
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多