Python == with或vs. list in comparison

use*_*044 3 python python-2.7

检查相等性时,以下速度和功能之间是否存在任何实际差异:

number = 'one'
if number == 'one' or number == 'two':
Run Code Online (Sandbox Code Playgroud)

number = 'one'
if number in ['one', 'two']:
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 6

如果值是文字常量(如本例所示),in则可能运行得更快,因为(极其有限的)优化器将其转换tuple为一次性加载的常量,从而减少了对两个廉价负载执行的字节码工作,以及单个比较操作/条件跳转,其中链接ors涉及两个廉价负载和每个测试的比较op /条件跳转.

对于两个值,它可能没有多大帮助,但随着值的数量增加,字节代码相对于备选方案的节省(特别是如果命中不常见,或者在选项中均匀分布)可能是有意义的.

以上特别适用于CPython参考解释器; 其他解释器可能具有较低的每字节码成本,可以减少或消除性能差异.

如果number是更复杂的表达,则会带来一般优势; my_expensive_function() in (...)显然会超越my_expensive_function() == A or my_expensive_function() == B,因为前者只计算一次价值.

也就是说,如果其中的值tuple不是常量文字,特别是如果命中在早期值上是常见的,in通常会更昂贵(因为它必须创建每次测试的序列,即使它最终只测试第一个价值).