检查相等性时,以下各项的速度和功能之间是否有任何实际区别:
number = 'one'
if number == 'one' or number == 'two':
与。
number = 'one'
if number in ['one', 'two']:
如果值是文字常量(如本例所示(,则in
可能会运行得更快,因为(极其有限的(优化器将其转换为一次加载的常量tuple
,从而将执行的字节码工作减少到两个廉价加载,以及单个比较操作/条件跳转,其中链接or
涉及两个廉价加载和每个测试的比较操作/条件跳转。
对于两个值,它可能没有多大帮助,但随着值数量的增加,与替代值相比节省的字节码(特别是如果命中不常见,或均匀分布在选项中(可能是有意义的。
以上特别适用于CPython参考解释器;其他解释器可能具有较低的每字节码成本,从而减少或消除性能差异。
如果number
是一个更复杂的表达式,则一般优势就会出现;my_expensive_function() in (...)
显然会胜过my_expensive_function() == A or my_expensive_function() == B
,因为前者只计算一次值。
也就是说,如果tuple
中的值不是常量文本,特别是如果命中在较早的值上很常见,则in
通常会更昂贵(因为它必须每次创建用于测试的序列,即使它最终只测试第一个值(。
谈论功能 - 不,这两种方法通常不同:请参阅 https://stackoverflow.com/a/41957167/747744