iteritems 的优点是什么?

2024-05-16

我使用的是 Python 2.7.5 @ Mac OS X 10.9.3,具有 8GB 内存和 1.7GHz Core i5。我测试了如下的时间消耗。

d = {i:i*2 for i in xrange(10**7*3)} #WARNING: it takes time and consumes a lot of RAM

%time for k in d: k,d[k]
CPU times: user 6.22 s, sys: 10.1 ms, total: 6.23 s
Wall time: 6.23 s

%time for k,v in d.iteritems(): k, v
CPU times: user 7.67 s, sys: 27.1 ms, total: 7.7 s
Wall time: 7.69 s

看来 iteritems 速度较慢。 我想知道 iteritems 比直接访问 dict 有什么优势。

更新: 以获得更准确的时间曲线

In [23]: %timeit -n 5 for k in d: v=d[k]
5 loops, best of 3: 2.32 s per loop

In [24]: %timeit -n 5 for k,v in d.iteritems(): v
5 loops, best of 3: 2.33 s per loop

为了回答你的问题,我们应该首先挖掘一些关于如何以及何时的信息iteritems()已添加到 API 中。

The iteritems() https://docs.python.org/2/library/stdtypes.html#dict.iteritems方法 在Python2.2中引入后添加迭代器 http://legacy.python.org/dev/peps/pep-0234/ and 发电机 https://docs.python.org/3/whatsnew/2.2.html#pep-255-simple-generators在语言中(另见:dict.items() 和 dict.iteritems() 有什么区别? https://stackoverflow.com/questions/10458437/python-what-is-the-difference-between-dict-items-and-dict-iteritems)。事实上,该方法在 PEP 234 中明确提及。因此,它被引入作为现有方法的惰性替代方案items() https://docs.python.org/2/library/stdtypes.html#dict.items.

这遵循与以下相同的模式file.xreadlines() https://docs.python.org/2/library/stdtypes.html#file.xreadlines versus file.readlines() https://docs.python.org/2/library/stdtypes.html#file.readlines它是在 Python 2.1 中引入的(顺便说一下,在 python2.3 中已经弃用了)。

在Python 2.3中itertools添加了模块,引入了惰性对应项map https://docs.python.org/2/library/itertools.html#itertools.imap, filter https://docs.python.org/2/library/itertools.html#itertools.ifilter etc.

换句话说,当时存在(并且仍然存在)操作懒惰的强烈趋势。原因之一是提高记忆效率。另一种是避免不必要的计算。

我找不到任何参考资料表明引入它是为了提高字典循环的速度。它只是用来替换对items()实际上不必返回列表。请注意,这包括更多的用例,而不仅仅是简单的for loop.

例如代码中:

function(dictionary.iteritems())

你不能简单地使用for循环替换iteritems()就像你的例子一样。你必须编写一个函数(或使用 genexp,即使它们在iteritems()被引入,并且它们不会是 DRY...)。

从 a 中检索项目dict经常这样做,所以提供一个内置方法确实有意义,事实上,有一个:items()。问题在于items()就是它:

  • 它并不懒惰,这意味着在大的情况下调用它dict可能需要相当长的时间
  • 它需要大量的内存。如果调用一个非常大的程序,它几乎可以使程序的内存使用量增加一倍dict包含大多数被操纵的对象
  • 大多数时候只迭代一次

因此,在引入迭代器和生成器时,显然只需添加一个惰性对应项即可。如果您需要一个项目列表,因为您想对其建立索引或迭代多次,请使用items(),否则你可以使用iteritems()并避免上述问题。

使用的优点iteritems()与使用相同items()与手动获取值相比:

  • 您编写的代码更少,这使其更加干燥并减少出错的机会
  • 代码更具可读性。

再加上懒惰的优点。


正如我已经说过的,我无法重现您的性能结果。在我的机器上iteritems() is always比迭代+按键查找更快。无论如何,差异可以忽略不计,这可能是由于操作系统处理缓存和内存的方式所致。换句话说,你关于效率的论点并不是反对(也不是赞成)使用一种或另一种替代方案的有力论据。

考虑到平均性能相同,请使用最具可读性和简洁性的替代方案:iteritems()。这个讨论类似于问“当你可以以相同的性能按索引循环时为什么要使用 foreach?”。 foreach 的重要性不在于迭代速度更快,而在于避免编写样板代码并提高可读性。


我想指出的是iteritems()实际上在 python3 中被删除了。这是该版本“清理”的一部分。 Python3items() https://docs.python.org/3.5/library/stdtypes.html#dict.items方法(大部分)等同于 Python 2 的viewitems() https://docs.python.org/2.7/library/stdtypes.html#dict.viewitems方法(如果我没记错的话,实际上是向后移植......)。

这个版本是惰性的(因此提供了替代品)iteritems())并且还具有进一步的功能,例如提供“类似集合”的操作(例如查找之间的公共项)dicts以有效的方式等)所以在python3中使用的原因items()而不是手动检索值更引人注目。

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

iteritems 的优点是什么? 的相关文章

  • .NET:ForEach() 扩展方法和字典

    我有一个简单的问题 我对 Dictionary Value 集合进行了大量迭代 令我烦恼的是 我必须调用 ToList 才能调用 ForEach 因为似乎没有一个可枚举集合Dictionary 字典本身 Keys集合或Values集合 有一
  • 将字典写入 csv 时遇到问题,其中键作为标题,值作为列

    我有一本字典 看起来像 mydict foo 1 2 bar 3 4 asdf 5 6 我正在尝试将其写入 CSV 文件 使其看起来像 foo bar asdf 1 3 5 2 4 6 我花了最后一个小时寻找解决方案 我发现的最接近的解决方
  • Python 如果 kwargs 中的 key 并且 key 为 true

    if force in kwargs and kwargs force is True 感觉应该有更好的方法来编写这个条件 因为我重复了键和变量 假设您确实想检查返回的关键字参数是否is True 这是另一种稍微不同的方式 if kwarg
  • 在 CSV 文件的最上面一行写入

    我有这个sample csv 文件 a 1 apple b 2 banana c 3 cranberry d 4 durian e 5 eggplant 并有以下代码 samplefile open sample csv rb rows s
  • 通过套接字发送包含文件的字典(python)

    是否可以通过套接字发送包含文件 图像或文档 作为值的字典 我尝试了类似下面的东西 但失败了 with open cat jpeg rb as f myFile f read 2048 data id 1283 filename cat jp
  • 在 std::vector> 中迭代 const T&

    我有一堂这样的课 class RPNExpr std vector
  • 在 python 上获取大目录文件列表的最佳方法?

    我有一个疯狂的大目录 我需要通过 python 获取文件列表 在代码中我需要获取迭代器 而不是列表 所以这不起作用 os listdir glob glob uses listdir os walk 我找不到任何好的库 帮助 也许是c li
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • 类型错误:不支持的类型

    我需要在 GPU 中运行代码的某些部分cupy代替numpy 所以 我只对这一行做了评论 import numpy as np并用这一行代替它import cupy as np 完整代码 from imutils video import
  • 如何在 pygame 中水平翻转图像?

    这是在 pygame 如何翻转图像 假设一个图像 猪向右看 时向左看 我按向左箭头键 然后保持这样 即使我不按任何键或者按向上和向下箭头键 那么 当我按向右箭头键时 如何再次将其切换回向右看 并使其保持这种状态 即使我不按任何键或按向上和向
  • 为什么不能收集一定范围的字符?

    我正在尝试生成一个包含小写 ASCII 字符的向量 这种更复杂的方法有效 let ascii lowercase b a b z map b b as char collect
  • 根据三列中的值组织行

    导入并获取数据集import numpy as np import matplotlib pyplot as plt import pandas as pd df pd DataFrame DaysExperienceTask 7 8 2
  • 在 Python 3.x 中,让 print 像在 Python 2 中一样工作(as 语句)

    我想知道 print 函数是否可以像 Python 2 及更早版本中那样工作 无需更改整个语法 所以我有这样的声明 print Hello World 我喜欢在 Python 3 中使用该语法 我尝试导入该库six 但这并没有解决问题 仍然
  • 要传递给迭代器的值类型的可变包装器

    我正在编写一个需要传递可变整数的迭代器 public IEnumerable
  • 找出段落中出现的单词

    sentence Alice was not a bit hurt and she jumped up on to her feet in a moment words Alice jumped played 我可以使用filterpyth
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • 如何更新由基类的可变默认参数创建的属性,而不修改该参数? [复制]

    这个问题在这里已经有答案了 我发现新式类中的子类化和字典更新存在一个奇怪的问题 Python 2 6 2 r262 71605 Apr 14 2009 22 40 02 MSC v 1500 32 bit Intel on win32 gt
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea

随机推荐

  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • JasperReports Server 参数依赖关系

    我有一份有两个输入参数的报告 两者都有一个保管箱 我可以在其中选择值 假设参数A 和参数B 是否可以使 ParameterB 依赖于 ParameterA 例如 如果我在 ParameterS 中选择汽车品牌 Honda 我应该只能看到 H
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 如何将事物的组合映射到关系数据库?

    我有一个表 其记录代表某些对象 为了简单起见 我假设该表只有一列 这是唯一的ObjectId 现在我需要一种方法来存储该表中的对象组合 组合必须是唯一的 但可以是任意长度 例如 如果我有ObjectIds 1 2 3 4 我想存储以下组合
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 选择里面的 Include in EF Core

    我有一个如下所示的实体 为简洁起见 部分删除 它包括许多其他属性 public class Tender Key DatabaseGenerated DatabaseGeneratedOption Identity public int I
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • 如何让 PyC​​harm 始终显示行号

    我似乎无法找到启用行号的设置all文件 但我必须始终右键单击并在每个文件的基础上启用此功能 必须有一个全局设置 对吧 2 6及以上版本 PyCharm 最左侧菜单 gt 首选项 gt 编辑器 左下部分 gt 常规 gt 外观 gt 显示行号
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • Akka-Http 2.4.9 抛出 java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory 异常

    我正在尝试使用 Akka http 构建一个简单的 Web 服务 我遵循了这个指南 http doc akka io docs akka 2 4 9 scala http low level server side api html htt
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 当我使用可变参数而不是常量参数时,为什么我的内联表 UDF 慢得多?

    我有一个表值内联 UDF 我想过滤该 UDF 的结果以获得一个特定值 当我使用常量参数指定过滤器时 一切都很好 并且性能几乎是瞬时的 当我使用可变参数指定过滤器时 它会花费明显更大的时间块 大约是逻辑读取的 500 倍和持续时间的 20 倍
  • 测验;这个编译了吗?如果是的话它会返回什么(我知道答案)

    我最近发现这个错字 if name find string npos 显然开发者的意思是输入 if name find string npos 但令我惊讶的是发现错误甚至编译 Wall Werror 没有尝试过 pedantic 那么 咖啡
  • 如何在Windows 8上正确使用SCardGetStatusChange?

    智能卡服务在 Windows 8 上的行为有所不同 并且 MSDN 尚未更新其文档 任何人都可以提供有关如何正确调用 SCardGetStatusChange 来监视 Windows 8 上的智能卡操作的代码片段吗 提前致谢 这是我为个人博
  • 使 Bootstrap Popover 在悬停而不是单击时出现/消失

    我正在使用 Bootstrap 构建一个网站Popover http twitter github com bootstrap javascript html popovers我不知道如何使弹出窗口出现在悬停而不是单击时 我想做的就是当有人
  • Django REST JWT 刷新

    使用 JWT 实施 Django REST 和身份验证 对于 JWT 令牌 我们必须在过期之前刷新它 过期后 JWT 将不会提供新的令牌 对于我的移动设备 我需要每 10 分钟刷新一次令牌 JWT EXPIRATION DELTA 如果用户
  • iteritems 的优点是什么?

    我使用的是 Python 2 7 5 Mac OS X 10 9 3 具有 8GB 内存和 1 7GHz Core i5 我测试了如下的时间消耗 d i i 2 for i in xrange 10 7 3 WARNING it takes