copy.deepcopy 与 pickle

2024-04-11

我有一个小部件的树结构,例如集合包含模型,模型包含小部件。我想复制整个收藏,copy.deepcopy与“pickle and de-pickle”对象相比更快,但用 C 编写的 cPickle 更快,因此

  1. 为什么我(我们)不应该总是使用 cPickle 而不是 deepcopy?
  2. 还有其他复制替代方案吗?因为pickle比deepcopy慢,但cPickle更快,所以deepcopy的C实现可能会是赢家

示例测试代码:

import copy
import pickle
import cPickle

class A(object): pass

d = {}
for i in range(1000):
    d[i] = A()

def copy1():
    return copy.deepcopy(d)

def copy2():
    return pickle.loads(pickle.dumps(d, -1))

def copy3():
    return cPickle.loads(cPickle.dumps(d, -1))

Timings:

>python -m timeit -s "import c" "c.copy1()"
10 loops, best of 3: 46.3 msec per loop

>python -m timeit -s "import c" "c.copy2()"
10 loops, best of 3: 93.3 msec per loop

>python -m timeit -s "import c" "c.copy3()"
100 loops, best of 3: 17.1 msec per loop

问题是,pickle+unpickle 可以更快(在 C 实现中),因为它是不太笼统比深度复制:许多对象可以深度复制但不能腌制。假设你的班级A更改为...:

class A(object):
  class B(object): pass
  def __init__(self): self.b = self.B()

now, copy1仍然工作得很好(A 的复杂性减慢了它的速度,但绝对不会阻止它);copy2 and copy3中断,堆栈跟踪的末尾显示...:

  File "./c.py", line 20, in copy3
    return cPickle.loads(cPickle.dumps(d, -1))
PicklingError: Can't pickle <class 'c.B'>: attribute lookup c.B failed

也就是说,pickle 总是假设类和函数是其模块中的顶级实体,因此“按名称”pickle 它们——深度复制绝对不会做出这样的假设。

因此,如果您遇到“某种深度复制”的速度绝对至关重要的情况,那么每一毫秒都很重要,并且您想利用您知道适用于您正在复制的对象的特殊限制,例如那些进行酸洗的对象适用的,或者喜欢其他形式的序列化和其他快捷方式的人,无论如何都可以继续 - 但如果你这样做,你必须意识到你正在限制你的系统永远受到这些限制,并非常清楚地记录设计决策和明确是为了未来维护者的利益。

对于正常情况,如果您想要通用性,请使用deepcopy!-)

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

copy.deepcopy 与 pickle 的相关文章

  • MANIFEST.in、package_data 和 data_files 澄清吗?

    我正在尝试创建一个 Python 包 并且目录结构如下 mypkg init py module1 x py y py z txt module2 a py b py 然后我将所有文件添加到MANIFEST in当我检查创建的存档时 它包含
  • 使用 OpenCV 和/或 Numpy 对两个图像进行 Alpha 混合 [重复]

    这个问题在这里已经有答案了 我想将一个填充纯色的半透明矩形添加到已加载的半透明 PNG 中 这是我正在使用的输入图像示例 该图像加载了标准cv2 IMREAD UNCHANGED标志 以便完美保留 alpha 通道 该输入图像存储在imag
  • 如何在 Google App Engine 的 Python 中获取 StringProperty 的值?

    如何获取 nbd Model 的值 我想返回由多个字段组成的描述 但我无法让它工作 这是我的班级代码 class User ndb Model name ndb StringProperty email ndb StringProperty
  • 最小二乘法拟合直线 python 代码

    我有一个由 X 和 Y 坐标组成的散点图 我想使用直线的最小二乘拟合来获得最佳拟合线 直线最小二乘拟合是指 如果 x 1 y 1 x n y n 是测量数据对 则最佳直线是y A Bx 这是我的Python代码 number of poin
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • 通用详细视图 ProfileView 必须使用对象 pk 或 slug 调用

    我是 Django 2 0 的新手 在访问我的个人资料页面视图时收到此错误 它适用于像这样的网址path users
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得
  • reStructuredText:README.rst 未在 PyPI 上解析

    我有一个托管在 Github 和 PyPI 上的 Python 项目 在 Github 上 https github com sloria TextBlob blob master README rst https github com s
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • Pandas:将 pytz.FixedOffset 应用于系列

    我有一个带有timestamp列看起来像这样 0 2020 01 26 05 00 00 08 00 1 2020 01 26 06 00 00 08 00 Name timestamp dtype datetime64 ns pytz F
  • PyArmor - 打包为一个可执行文件

    当我执行此命令时 您好 使用 PyArmor pyarmor pack main py 它将它打包到一个名为的文件夹中dist里面包含我的 exe 以及许多 Python 扩展文件 据我所知 PyArmor 使用 PyInstaller 来
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 具有多个主键的 SQLAlchemy 不会自动设置任何

    我有一个简单的表 class test Base tablename test id Column Integer primary key True title Column String def init self title self
  • 计算 pyspark df 列中子字符串列表的出现次数

    我想计算子字符串列表的出现次数 并根据 pyspark df 中包含长字符串的列创建一个列 Input ID History 1 USA UK IND DEN MAL SWE AUS 2 USA UK PAK NOR 3 NOR NZE 4
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • Python:无法使用 os.system() 打开文件

    我正在编写一个使用该应用程序的 Python 脚本pdftk http www pdflabs com tools pdftk the pdf toolkit 几次来执行某些操作 例如 我可以在 Windows 命令行 shell 中使用
  • 在父类中访问子类变量

    我有一个父类和一个继承的子类 我想知道如何访问我的父类中的子类变量 我尝试了这个但失败了 class Parent object def init self print x class Child Parent x 1 x Child Er
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似

随机推荐

  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • iOS Swift 3 参数前面有下划线

    今天我在Xcode中打开我的项目 需要将当前的Swift转换为Swift 3 转换后 我发现函数的所有参数前面都有一个下划线 例如 func didGetWeather weather Weather 我尝试去掉下划线 效果很好 我想知道这
  • IE9 ReactJs 中未定义“Set”或“Map”

    我使用 React 16 2 0 创建了一个简单的应用程序 当我在 IE9 上执行 运行它时 它显示控制台错误 Set 或 Map 未定义 我发现在 IE9 上运行我的 React 应用程序需要一些填充 我按照以下步骤操作 它对我有用 由于
  • MPL pos 是一个未记录的元函数吗?

    里面有下面的示例代码BOOST MPL 文档find算法 http www boost org doc libs 1 46 1 libs mpl doc refmanual find html typedef vector
  • 什么是部分视图?

    我一直在使用 Codeigniter 来习惯模型 视图 控制器架构 并尝试加快制作和实现网站的过程 我不断看到对 部分视图 的引用 但找不到该术语的定义 谁能告诉我什么是部分视图以及它在哪里使用 部分视图只是可以包含在父视图中的子视图 我们
  • Sonata 管理捆绑包 - 表单类型:sonata_type_collection - 自定义模板?

    是否可以覆盖表单类型的模板 sonata type collection 我已经尝试过以下方法 formMapper gt add slides sonata type collection array array edit gt inli
  • 如何将“element.offsetParent”与 HTML SVG 元素一起使用?

    我正在对一些 javascript 进行维护 它使用 offsetParent http www quirksmode org js findpos html财产 最近的更改现在使应用程序使用 SVG 元素 并且它们破坏了 JavaScri
  • 如何在 Iphone 上显示带有 UIButton 的 UINavigationController?

    在我的应用程序中 第一个视图是一个 UIView 带有几个 uilabel 和一个 uibutton 来进行登录 我想在登录后显示一个带有表格的 uinavigationcontroller 因此可以使用按钮的操作 我知道如何从 Xcode
  • Python 中的(命名)元组字典和速度/RAM 性能

    我正在创建一本字典d一百万个元组项目 理想情况下我想通过以下方式访问它们 d 1634 id or d 1634 id d 1634 name or d 1634 name d 1634 isvalid or d 1634 isvalid
  • 如何使用 vba 将临时记录集导出到 csv 文件

    我有一个 MS Access 表 正在跟踪 50 种产品及其每日销量 我想使用 vba 1 csv 文件 包括标题 导出每个产品 显示记录集中的每日交易量 而不将记录集保存到永久查询 我正在使用下面的代码 但我陷入了下面代码中突出显示的实际
  • 如何在静态服务器上托管 ReactJS 项目

    我已经构建了一个 React 应用程序 它在本地服务器上运行良好 但是 当我运行 npm run build 时 该过程似乎正确执行 创建 build 文件夹 其中包含捆绑的 js 文件和 index html 文件 但是当我在浏览器中打开
  • 每个用户的子域

    我拥有一个网站 为每个注册用户提供一个专用空间 如下所示 www mywebpage com user1 www mywebpage com user2 www mywebpage com user3在这条路径中 用户有他的迷你网站 我想为
  • 自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度?

    我已经准备好了一个简单的测试项目 https github com afarber android newbie tree q19 MyPrefs我在 GitHub 上提出的问题 我的项目中有一个自定义inline 搜索栏首选项 https
  • Python ctypes:带有 LPCSTR [out] 参数的原型

    我目前正在进入ctypes模块 我正在尝试调用 user32 函数GetWindowText http msdn microsoft com en us library windows desktop ms633520 28v vs 85
  • SSL23_GET_SERVER_HELLO:未知协议[连接到msa(587)端口]

    当新用户注册并忘记密码时 我正在尝试发送电子邮件 我正在 Linux 上工作 该应用程序是使用 node js 开发的 Error Error 140020013401920 error 140770FC SSL routines SSL2
  • d3js 将标签移动到节点旁边

    我正在开发一个通过图表进行模式表示的项目 我来从 json 检索数据以生成图形并找到与节点关联的标签 我还想找到与链接对应的标签 但是 当移动节点时 我无法移动标签 有什么帮助吗 请参阅此处的代码 http jsfiddle net obo
  • Matlab 中行索引的笛卡尔积

    我有一个二进制矩阵A维度的mxn with m gt n在Matlab中 我想构造一个矩阵B维度的cxn按行列出包含在中的行索引的笛卡尔积的每个元素A 为了更清楚地考虑以下示例 例子 m 4 n 3 A 1 0 1 0 0 1 1 1 0
  • 如何解决 JDK 17 中 Field.setAccessible 的 InaccessibleObjectException?

    使用 JDK 17 不可能再使用反射来访问字段 至少对于java lang 课程 以下片段 final Process process new ProcessBuilder directory new File d temp command
  • 使用 Geoplugin 旋转链接

    我使用 geoplugin class 将 CA 用户重定向到特定链接 现在 该代码仅允许我将用户重定向到 1 个网站 我想修改此代码 以便我可以将用户重定向到 link1 com link2 com link3 com 有人对此有快速修改
  • copy.deepcopy 与 pickle

    我有一个小部件的树结构 例如集合包含模型 模型包含小部件 我想复制整个收藏 copy deepcopy与 pickle and de pickle 对象相比更快 但用 C 编写的 cPickle 更快 因此 为什么我 我们 不应该总是使用