python - 我应该在 Python 3.x 的 if 语句中使用 'in' 还是 'or' 来根据多个值检查变量?

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

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

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

或:

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

最佳答案

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

if x in {2, 3, 4}:

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

在 Python 3 中,set literal 将被优化为使用 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 中你最好使用元组。对于少量元素,每次执行的集合创建消除了查找时间的差异。

关于python - 我应该在 Python 3.x 的 if 语句中使用 'in' 还是 'or' 来根据多个值检查变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24678118/

相关文章:

python - 具有多个参数的复杂排序?

javascript - 如何使用 JavaScript 或 Selenium 检查页面上是否存在警报

python - 如何重新加载 python 子模块?

python - 如何替换 Pandas 数据框中拼写错误的单词

java - Java 整数数组的高性能集合类数据结构

python - 如何使用 CommentedMap 对 YAML 进行递归排序?

python - Django-Filter:在搜索时动态创建查询集或在搜索之前隐藏查询集

python 结构。错误: 'i' format requires -2147483648 <= number <= 2147483647

MySql `id` 列有一个 'PRIMARY' 和一个 'UNIQUE' 索引,这是理想的吗?

jQuery hasClass() - 检查多个类