Python pickle 协议选择?

2024-02-28

我使用 python 2.7 并尝试腌制一个对象。我想知道 pickle 协议之间的真正区别是什么。

import numpy as np
import pickle

class Data(object):
  def __init__(self):
    self.a = np.zeros((100, 37000, 3), dtype=np.float32)

d = Data()
print("data size: ", d.a.nbytes / 1000000.0)
print("highest protocol: ", pickle.HIGHEST_PROTOCOL)
pickle.dump(d, open("noProt", "w"))
pickle.dump(d, open("prot0", "w"), protocol=0)
pickle.dump(d, open("prot1", "w"), protocol=1)
pickle.dump(d, open("prot2", "w"), protocol=2)


out >> data size:  44.4
out >> highest protocol:  2

然后我发现保存的文件在磁盘上的大小不同:

  • noProt:177.6MB
  • prot0:177.6MB
  • prot1:44.4MB
  • prot2: 44.4MB

我知道prot0是一个人类可读的文本文件,所以我不想使用它。 我猜协议 0 是默认给出的协议。

我想知道协议 1 和 2 之间有什么区别,是否有理由让我选择其中之一?

用什么比较好pickle or cPickle?


使用支持您想要支持读取数据的最低 Python 版本的最新协议。较新的协议版本支持新的语言功能并包括优化。

来自pickle模块数据格式文档 https://docs.python.org/3/library/pickle.html#data-stream-format:

目前有 6 种不同的协议可用于酸洗。使用的协议越高,读取生成的 pickle 所需的 Python 版本就越新。

  • 协议版本 0 是原始的“人类可读”协议,并且向后兼容早期版本的 Python。
  • 协议版本 1 是一种旧的二进制格式,也与早期版本的 Python 兼容。
  • 协议版本 2 是在 Python 2.3 中引入的。它提供了更有效的酸洗新式课堂 https://docs.python.org/3/glossary.html#term-new-style-class。参考PEP 307 https://www.python.org/dev/peps/pep-0307有关协议 2 带来的改进的信息。
  • Python 3.0 中添加了协议版本 3。它有明确的支持bytes https://docs.python.org/3/library/stdtypes.html#bytes对象并且不能被 Python 2.x 解封。这是 Python 3.0–3.7 中的默认协议。
  • Python 3.4 中添加了协议版本 4。它增加了对非常大的对象的支持,腌制更多种类的对象,以及一些数据格式优化。它是从 Python 3.8 开始的默认协议。参考PEP 3154 https://www.python.org/dev/peps/pep-3154有关协议 4 带来的改进的信息。
  • Python 3.8 中添加了协议版本 5。它增加了对带外数据的支持和对带内数据的加速。参考PEP 574 https://www.python.org/dev/peps/pep-0574有关协议 5 带来的改进的信息。

并从[pickle.Pickler(...)班级部分](

可选的protocol参数,一个整数,告诉pickler使用给定的协议;支持的协议为 0 到HIGHEST_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.HIGHEST_PROTOCOL。如果没有指定,则默认为DEFAULT_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.DEFAULT_PROTOCOL。如果指定负数,HIGHEST_PROTOCOL https://docs.python.org/3/library/pickle.html#pickle.HIGHEST_PROTOCOL被选中。

因此,当您想支持使用Python 3.4或更高版本加载pickled数据时,请选择协议4。如果您仍需要支持Python 2.7,请选择协议2,尤其如果您使用的是派生自的自定义类object(新式类)(现在任何现代代码都会这样做)。

但是,如果您要与其他 Python 版本交换 pickled 数据,或者需要保持与旧 Python 版本的向后兼容性,最简单的方法是坚持使用您可以掌握的最高协议版本:

with open("prot2", 'wb') as pfile:
    pickle.dump(d, pfile, protocol=pickle.HIGHEST_PROTOCOL)

pickle.HIGHEST_PROTOCOL始终是当前 Python 版本的正确版本。因为这是二进制格式,所以请确保使用'wb'作为文件模式!

Python 3 不再区分cPickle and pickle,始终使用pickle当使用 Python 3 时。它在底层使用编译的 C 扩展。

如果您仍在使用 Python 2,那么cPickle and pickle大部分是兼容的,区别在于提供的API。对于大多数用例,只需坚持cPickle;它更快。引用文档 https://docs.python.org/2/library/pickle.html#module-cPickle again:

First, cPickle可以比 pickle 快 1000 倍,因为前者是用 C 实现的。 其次,在cPickle模块可调用对象Pickler() and Unpickler()是函数,而不是类。这意味着您不能使用它们来派生自定义 pickling 和 unpickling 子类。大多数应用程序不需要此功能,并且应该受益于大大提高的性能cPickle module.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python pickle 协议选择? 的相关文章

  • Virtualenv 在 OS X Yosemite 上失败并出现 OSError

    我最近更新到 OSX Yosemite 现在无法使用virtualenv pip 每当我执行 virtualenv env 它抛出一个 OSError Command Users administrator ux env bin pytho
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • Paste.httpserver 并通过 HTTP/1.1 Keep-alive 减慢速度;使用 httperf 和 ab 进行测试

    我有一个基于paste httpserver 的Web 服务器作为HTTP 和WSGI 之间的适配器 当我使用 httperf 进行性能测量时 如果每次使用 num conn 启动一个新请求 我每秒可以执行超过 1 000 个请求 如果我使
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 无法通过 Python 子进程进行 SSH

    我需要通过堡垒 ssh 进入机器 因此 该命令相当长 ssh i
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • 无法安装最新版本的 Numpy (1.22.3)

    我正在尝试安装最新版本的 numpy 即 1 22 3 但看起来 pip 无法找到最后一个版本 我知道我可以从源代码本地安装它 但我想了解为什么我无法使用 pip 安装它 PS 我有最新版本的pip 22 0 4 ERROR Could n

随机推荐

  • 为什么 JMX 报告的 JVM 堆使用最大值会随时间变化?

    我的一个 hadoop 集群的名称节点上的 JVM 堆最大值配置为 8GB 当我使用 JMX 监控 JVM 时 报告的最大值不断波动 如附图所示 http highlycaffeinated com assets images heapma
  • Python 可以识别交互运行的文件的更改吗?

    我正在做一些故障排除 我很好奇是否可以交互地运行 Python 脚本 更改脚本中定义的函数 保存文件 然后让交互式 shell 识别更改 这是我目前正在做的一个例子 my script py def dummy func print Som
  • 使用 @parameters 的 T-SQL 动态分组

    我想实现 SELECT param1 param2 param3 t field1 sum t amount FROM table t WHERE t field 2 IS NOT NULL AND t field3ID 12345 GRO
  • scipy PchipInterpolator 实现问题

    我正在尝试基于链接实现 PchipInterpolator http docs scipy org doc scipy 0 14 0 reference generated scipy interpolate PchipInterpolat
  • pdf.js 与本地 pdf 文件

    我正在尝试 pdf js 库 只想在我的服务器上显示本地 pdf 文件 而不是示例提供的 pdf 文件
  • 带有构建优化器的 AOT 和 JIT

    我正在关注解决方案here https github com Alekcei AotAndJit使用的JitCompilerFactory加载运行时编译器和自定义装饰器以保留组件和模块元数据 但是有了 Angular cli build o
  • golang中如何通过引用传递结构体类型的接口?

    我需要通过引用传递结构类型的接口 如下所示 由于我不能使用接口指针来构造类型变量 我应该如何更改以下代码来修改te价值10 package main import fmt func another te interface te check
  • 获取使用 Chart.js 渲染的折线图 y 轴的最大值

    我使用 Chart js 渲染分散折线图 效果非常好 对于渲染算法 我需要找出 y 轴上显示的最高值 因此假设数据集中的 最大 点为 y 248 因此 y 轴显示 250 作为最大值 我需要知道它是250 我尝试在运行时检查图表对象 如下所
  • Material UI 主题覆盖:如何全局覆盖子样式?

    我正在构建一个应用程序材质UI库 https material ui com 对于 ReactJS 使用主题覆盖 API https material ui com customization overrides global theme
  • MongoDB C# 2.0 超时异常

    我们最近将 Web 应用程序升级到 MongoDB C Driver 2 0 并部署到生产环境 在一定负载以下 应用程序运行良好 一旦生产服务器上的负载超过一定限制 应用程序的CPU立即降至0 大约30秒后 该异常会被记录多次 System
  • 轮播图像未填充 bootstrap 3 中的宽度

    我对这种响应式的东西太陌生了 我正在尝试使用新 bootstrap 3 中的轮播 但由于某种原因 图像没有填充轮播的宽度 所有图像的尺寸完全相同 1000x395 无论我做什么 它都不会完全填满 非常感谢任何和所有的帮助 这是我正在使用的代
  • 获取当前的 jQuery 选择器字符串?

    调用自定义插件时 如何获取当前选择器字符串 my selector p my plugin 想要输出my selector p在我的脚本中 我怎样才能访问这个字符串 您可以使用selector https api jquery com se
  • Kubernetes客户子域动态绑定

    我有以下用例 我们的客户经常在其 K8s 集群上发布新服务 这些新服务可以通过负载平衡和 Ingress 从外部访问 以便在部署服务后动态配置此负载平衡 这对于我们客户的开发团队来说非常容易 因为他们不必等到有人手动配置负载平衡 他们只需在
  • 点之间的角度?

    我有一个三角形 A B C 我试图找到每对三个点之间的角度 问题是我可以在网上找到的算法是用于确定向量之间的角度 使用向量 我可以计算从 0 0 到我所拥有的点的向量之间的角度 但这并不能给出三角形内的角度 好的 这是在维基百科页面上的方法
  • 使用 Python 在文件行中搜索列表条目

    我有一个包含数万行 ASCII 文本的文本文件 我有一个包含数百个要搜索的关键字的列表 单独考虑每一行 最初 如果有任何匹配项 我想返回 打印到屏幕或文件 该行 但最终我想根据匹配数对返回的行进行排名或排序 所以 我的清单是这样的 keyw
  • 无法使用接口确定 i => i.Id 的序列化信息

    首先 我知道这个错误消息已经存在问题 但我还没有找到任何与使用此类查询的接口相关的问题 我目前正在尝试使用 C 驱动程序 2 0 更新 MongoDB 实体 但是 当我尝试构建查询时出现错误 我假设它是Builders
  • .replace() 之后恢复光标位置

    我最大的问题是 替换后 光标默认位于文本区域的末尾 如果我正在打字 那没有问题 但如果我要返回并编辑 那就真的很烦人了 这是我尝试过的 文本区域的 id 是 区域 var el e area position el selectionSta
  • 实体框架默认连接工厂

    我最近使用实体框架 4 3 创建了一个新的 Web 项目 我正在使用数据库优先设计 实体框架将此部分添加到我的 web config 中 它提供了一些信息性错误消息 我在某处读到此代码与代码优先设计相关 我是否需要它 我是否只需删除它
  • 在 pandas dataframe python 中使用 pii 对特定列进行匿名化

    我已经加载了一个带有 json 文件的 s3 存储桶 并将其解析 压平到 pandas 数据帧中 现在我有一个包含 175 列的数据框 其中 4 列包含个人身份信息 我正在寻找一种快速解决方案 对这些列 名称和地址 进行匿名化 我需要保留多
  • Python pickle 协议选择?

    我使用 python 2 7 并尝试腌制一个对象 我想知道 pickle 协议之间的真正区别是什么 import numpy as np import pickle class Data object def init self self