Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python==与或与列表中的比较_Python_Python 2.7 - Fatal编程技术网

Python==与或与列表中的比较

Python==与或与列表中的比较,python,python-2.7,Python,Python 2.7,检查是否相等时,以下各项的速度和功能是否存在实际差异: number = 'one' if number == 'one' or number == 'two': vs 如果值是文字常量(如本例中所示),中的可能运行得更快,因为(极其有限的)优化器将其转换为一个常量元组,该元组一次加载,将执行的字节码工作减少到两个廉价加载,以及一个比较操作/条件跳转,其中链式或涉及两个廉价加载和每个测试的比较op/条件跳转 对于两个值,这可能没有多大帮助,但随着值数量的增加,在替代方案上节省字节码(特别是在命

检查是否相等时,以下各项的速度和功能是否存在实际差异:

number = 'one'
if number == 'one' or number == 'two':
vs


如果值是文字常量(如本例中所示),中的
可能运行得更快,因为(极其有限的)优化器将其转换为一个常量
元组,该元组一次加载,将执行的字节码工作减少到两个廉价加载,以及一个比较操作/条件跳转,其中链式
涉及两个廉价加载和每个测试的比较op/条件跳转

对于两个值,这可能没有多大帮助,但随着值数量的增加,在替代方案上节省字节码(特别是在命中率不常见或均匀分布在选项上的情况下)可能是有意义的

上述内容特别适用于CPython参考解释程序;其他口译员可能具有较低的每字节码成本,以减少或消除性能差异

如果
数字
是一个更复杂的表达式,则通常会带来好处<代码>我的昂贵函数()在(…)中将明显优于
我的昂贵函数()==A或我的昂贵函数()==B
,因为前者只计算一次值


也就是说,如果
元组中的值不是常量文本,尤其是如果对早期值的命中比较常见,
中的
通常会比较昂贵(因为它必须创建每次测试的序列,即使它最终只测试第一个值)。

谈论功能性-不,这两种方法通常是不同的:参见

您是否
timeit
?怎么搞的?如果
number='two'
,或者在假y的情况下,该怎么办?如果性能很重要,为什么不在{'1','2'}
中使用
?我认为OP应该计时并自己回答。我会把两个帖子都投上一票,然后使用一个集合会比一个列表更快。因此,当您使用set与if语句进行计时检查时。@GrantWilliams:
set
仅当要测试的值的数量足够大时才有帮助;对于两个值,
set
没有帮助。在本例中,OP询问的是Python2,它没有优化
集合
文本中的测试,因此每次都必须从头开始重建
集合
,即使这些值都是文本常量,除非将集合创建为全局常量,否则速度肯定会变慢。在Python3上,有一种优化方法可以用常量
frozenset
替换上下文中常量的
set
文本,这样它可以在那里保存一些内容,但不能保存在Py2中。@JayCalamari我运行了timeit。我不知道。这方面的结果几乎相同。
NaN
的怪异之处值得注意,但这并不是一个“一般性差异”(
NaN
在其“不等同于自身”的行为上几乎是独一无二的)。就功能而言,['one','two']
中的
数字等同于(除了值加载计数)
数字等于'one'或数字等于'one'或数字等于'two'或数字等于'two'
。对于字符串,这纯粹是一种性能提升,而不是行为差异。@ShadowRanger如果我们谈论的是字符串列表或其他默认类型,我同意。但是用户定义类的对象可以实现它们自己的
\uuuueq\uuuuu
,这可以包括非平凡的计算或关注类似对象是否相等-检查
is
可以改变行为。对于覆盖
\uuuu包含\uuuu
的自定义容器也是如此(但我认为这是一种罕见的情况)。
number = 'one'
if number in ['one', 'two']: