【问题标题】:Should I use 'in' or 'or' in an if statement in Python 3.x to check a variable against multiple values?我应该在 Python 3.x 的 if 语句中使用“in”还是“or”来检查一个变量是否有多个值?
【发布时间】:2014-08-31 22:06:50
【问题描述】:

假设我有以下,这是更好、更快、更 Pythonic 的方法 为什么?

if x == 2 or x == 3 or x == 4:
    do following...

或:

if x in (2, 3, 4):
    do following...

【问题讨论】:

标签: python python-3.x performance if-statement


【解决方案1】:

在 Python 3(3.2 及更高版本)中,您应该使用 set

if x in {2, 3, 4}:

因为集合成员资格是 O(1) 测试,而使用单独的 or 相等测试或使用元组中的成员资格进行测试的最坏情况性能为 O(N)。

在 Python 3 中,集合文字将被优化为使用 frozenset 常量:

>>> import dis
>>> dis.dis(compile('x in {1, 2, 3}', '<file>', 'exec'))
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               4 (frozenset({1, 2, 3}))
              6 COMPARE_OP               6 (in)
              9 POP_TOP
             10 LOAD_CONST               3 (None)
             13 RETURN_VALUE

请注意,此优化是 added to Python 3.2,在 Python 2 或 3.0 或 3.1 中,您最好使用元组。对于少数元素,每次执行的集合创建都会抵消查找时间的差异。

【讨论】:

  • 我从没想过为此使用集合,只是保持了使用元组的旧习惯,但是当我在这里阅读时,我想“好吧,当然!”。所以谢谢!
  • 如果集合成员资格是 O(1) 测试,我假设集合中的值是散列的?
  • @JacobodeVera:较旧的 Python 版本(Python 2.x、Python 3.0 和 3.1)尚不支持优化,每次执行 x in {.., .., ..} 行时都会构造一个新的集合对象。
  • @TheSoundDefense:它们就像字典键一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多