在“if”子句中使用“in”时是元组还是列表?

2023-12-07

哪种方法更好?使用元组,例如:

if number in (1, 2):

或列表,例如:

if number in [1, 2]:

建议将哪一种用于此类用途?为什么(逻辑和性能方面)?


Python 解释器将第二种形式替换为第一种形式.

这是因为从常量加载元组是一项操作,但列表将是 3 项操作;加载两个整数内容并构建一个新的列表对象。

因为您使用的是无法通过其他方式访问的列表文字,所以它被替换为元组:

>>> import dis
>>> dis.dis(compile('number in [1, 2]', '<stdin>', 'eval'))
  1           0 LOAD_NAME                0 (number)
              3 LOAD_CONST               2 ((1, 2))
              6 COMPARE_OP               6 (in)
              9 RETURN_VALUE        

这里第二个字节码加载一个(1, 2)元组作为常量,在one步。将其与创建未在成员资格测试中使用的列表对象进行比较:

>>> dis.dis(compile('[1, 2]', '<stdin>', 'eval'))
  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 (2)
              6 BUILD_LIST               2
              9 RETURN_VALUE        

这里对于长度为 N 的列表对象需要 N+1 个步骤。

这种替换是 CPython 特定的窥孔优化;看到Python/peephole.c source. For other那么,Python 实现中,您应该坚持使用不可变对象。

也就是说,best使用 Python 3.2 及更高版本时的选项是使用设置文字:

if number in {1, 2}:

因为窥视孔优化器会将其替换为frozenset()针对集合的对象和成员资格测试是 O(1) 常量运算:

>>> dis.dis(compile('number in {1, 2}', '<stdin>', 'eval'))
  1           0 LOAD_NAME                0 (number)
              3 LOAD_CONST               2 (frozenset({1, 2}))
              6 COMPARE_OP               6 (in)
              9 RETURN_VALUE

此优化添加于Python 3.2但没有向后移植到 Python 2。

因此,Python 2 优化器无法识别此选项以及构建set or frozenset几乎可以肯定,从内容中获取比使用元组进行测试的成本更高。

集合成员资格测试是 O(1) 并且速度很快;对元组进行测试的最坏情况是 O(n)。尽管针对集合的测试必须计算哈希值(较高的恒定成本,针对不可变类型进行缓存),但针对元组的测试的成本除了第一个元素之外总是会更高。所以平均而言,集合很容易更快:

>>> import timeit
>>> timeit.timeit('1 in (1, 3, 5)', number=10**7)  # best-case for tuples
0.21154764899984002
>>> timeit.timeit('8 in (1, 3, 5)', number=10**7)  # worst-case for tuples
0.5670104179880582
>>> timeit.timeit('1 in {1, 3, 5}', number=10**7)  # average-case for sets
0.2663505630043801
>>> timeit.timeit('8 in {1, 3, 5}', number=10**7)  # worst-case for sets
0.25939063701662235
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在“if”子句中使用“in”时是元组还是列表? 的相关文章

随机推荐

  • Google 地图 API 错误:此 API 密钥无权使用此服务或 API。地点 API 错误:ApiTargetBlockedMapError

    我开始从我使用的 CMS 内的 Google 地图小部件收到此错误 This API key is not authorized to use this service or API Places API error ApiTargetBl
  • 在 Python 中生成 CSR

    我正在尝试在 Python 中生成 CSR 而不使用 OpenSSL 如果有人能指出正确的方向 我将非常感激 我假设你不想使用命令行 openssl 本身 Python 库就可以了 这是我编写的用于创建 CSR 的辅助函数 它从生成的密钥对
  • ConvertTimeFromUTC,处理澳大利亚夏令时

    我有以下代码 我有一位位于澳大利亚堪培拉的客户 它们通常是 UTC 10 但现在处于 DST 所以是 UTC 11 奇怪的是 当我运行此代码时 它没有考虑 DST 我认为 ConvertTimeFromUTC 可以处理 DST 我正在路过E
  • 使用 Xcode、Swift3 的 iOS Rich Push 通知但无法获取图像

    我正在尝试使用 Xcode Swift3 创建 iOS 丰富推送通知 我已经使用 php 的curl 命令确定推送通知 主题 正文 但我无法创建引用的丰富推送通知在本文件中 我添加了通知服务扩展 如下所示 File New Target N
  • JTextArea 中的行

    有没有可靠的方法来计算 JTextArea 中字符串如何划分为行 我有一个固定宽度的 JTextArea 当它被填充时 会添加一个新行并垂直扩展 现在 我需要确切地知道哪些字符位于哪一行 我可以使用字体规格来添加单个字符宽度 但我不知道这是
  • 如何对表中特定数量的行进行着色?

    如何仅对特定数量的行进行着色 这里我的显示屏只有前 7 行是白色的 其余的是灰色的 我想要 7 条白色线 7 条灰色线 7 条白色线 7 条灰色线等等 你可以尝试这样的事情 table gt span height 20px width 2
  • 将 php 变量添加到 css 语句中!

    我想在我的 css 样式声明中包含以下内容 是否可以
  • 如果表2中不存在,如何插入到表1中?

    我是mysql新手 如果 table2 中不存在记录 则将记录插入到 table1 时出现问题 我有 2 个表 table1 和 table2 其形式为 table1 dep id start stop modified deleted 1
  • 是否可以在Python中创建特定目录的快捷方式?

    我查了一下 inetrnet 但没有发现任何相关内容 所以我在这里问 是否可以使用 python 创建文件的快捷方式并将其放入我选择的特定目录中 例如 我在 C 中有一个名为 EXAMPLE 的文件夹 我想自动创建谷歌浏览器的快捷方式并将其
  • 我可以序列化 ruby​​ Digest::SHA1 实例对象吗?

    大家好 我正在 ruby sinatra 中重新实现现有的自定义文件上传服务 并使用 redis 作为后备存储 客户 计算 SHA1 哈希并启动上传 上传最多 64K 块直至完成 服务器 将块附加到文件 计算完整文件的 SHA1 哈希值以验
  • 在 Ansible 中,如何将活动角色的变量组合到一个数组中?

    看着 在 Ansible 中 如何将不同文件中的变量合并到一个数组中 答案之一建议使用包含变量要将多个来源的变量放入一个数组中 这是almost我需要什么 但不完全是 我正在设置 cloudfront logging 它需要 a 中的项目a
  • Qt 使应用程序始终位于 Weston/Wayland 平台之上

    我想在 Wayland Weston 桌面系统中安排两个应用程序的焦点 两个应用是 用 Qt QML 编写 全屏 使用 Wayland 客户端 API OpenGL 编写 全屏 我想让 App 1 始终位于顶部 App 2 始终位于底部 即
  • 使用 ElementTree 从混合元素 xml 标签中获取文本

    我正在使用 ElementTree 来解析我拥有的 XML 文档 我从以下位置获取文本u标签 其中一些包含混合内容 我需要过滤掉或保留为文本 我有两个例子 u u
  • 删除 id=".xxx" 的 div 或 span

    我无法删除 id 带有句点或星号的 div div div div div 我有 jquery 代码 它删除了 div div 但不是上面的 不是在寻找 jQuery 代码 但它需要正斜杠吗 来自 anurag 的请求 JavaScript
  • 回调到可变的 self

    有没有一种方法 在 Rust 中 可以将可变的借用自我发送到回调而不需要mem replace我在以下 MWE 中使用的 hack 我正在使用 Rust stable 1 11 0 use std mem trait Actable fn
  • 如何在强制推送基础分支后更新我的功能分支。我们只使用rebase,禁止合并

    我们正在使用 git 中的一个非常简单的结构 首先我们有我们的master branch 下面我们有develop 最后我们可以有任何feature branch 我们仅使用 rebase 来更新分支上的历史记录 然后转发到上述分支 每周
  • 集合编辑器未针对 TPersistent 属性中的 TCollection 属性打开

    我有我的自定义集合属性 当它是我的组件的直接成员时 它工作得很好 但我想将集合属性移动到组件内的 TPersistent 属性 现在问题来了 它不起作用 双击对象检查器中的集合属性通常会打开集合编辑器 但现在不再这样了 首先 我应该将什么传
  • 我的华为手机如何设置这个配置?

    我的问题是 在我的华为手机上 我的服务被终止 所以我需要更改手机上的设置 我的问题与this 注意 华为和小米设备具有邪恶的任务杀手服务 会干扰 Telegram 通知服务 为了让我们的通知发挥作用 您需要将 Telegram 添加到这些设
  • JavaScript 正则表达式将 URL 和电子邮件包装在锚点中

    我四处搜寻 但无法找到明确的答案 正则表达式经常出现这种情况 所以我想我会在这里问 我正在尝试组合一个可以在 JavaScript 中使用的正则表达式 以用指向它们的锚标记替换 URL 和电子邮件地址的所有实例 不需要如此严格 显然 这通常
  • 在“if”子句中使用“in”时是元组还是列表?

    哪种方法更好 使用元组 例如 if number in 1 2 或列表 例如 if number in 1 2 建议将哪一种用于此类用途 为什么 逻辑和性能方面 Python 解释器将第二种形式替换为第一种形式 这是因为从常量加载元组是一项