什么更快,`if x`还是`if x != 0`?

4

我在想,哪种代码运行更快?例如,我们有变量x:

if x!=0 : return

或者

if x: return

我使用 timeit 进行了测试,以下是测试结果:

 >>> def a():
...     if 0 == 0: return
...
>>> def b():
...     if 0: return
...>>> timeit(a)
0.18059834650234943
>>> timeit(b)
0.13115053638194007
>>>

我不太理解它。


6
除非你明确定义变量 x 的类型,否则这个问题没有答案。 - Charles Duffy
2
b更快,因为0是假值,而其他所有数字都是真值,所以您只执行了一个操作而不是两个。 - Eli Sadoff
3
根据x的不同,它们也不相同。 - Padraic Cunningham
12
顺便提一下,我们在Python标签中收到了很多微小优化的问题,但通常它们及其答案都是无用的:差异非常微小且由实现定义,因此不能保证它们在不同版本的解释器、不同的目标架构等方面存在。如果您关心节省几纳秒,那么您正在使用错误的语言。要注意的地方是使用高效的算法——一个算法级别的调整通常会超过您尝试微调以获得的任何性能。 - Charles Duffy
1
这句话的意思是:编写算法时要考虑机器的高效执行,但编写代码时要考虑人类的阅读。 - Charles Duffy
显示剩余7条评论
1个回答

16

在评论中很难展示这个:比所有评论都提到的更多(或更少;-))的事情正在发生。按照您显示的定义a()b(),让我们继续:

>>> from dis import dis
>>> dis(b)
  2           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE

发生的是,当CPython编译器遇到if 0:if 1:时,它在编译时进行评估,并且不会在运行时生成任何测试代码。因此,b()的代码只加载None并返回它。

但是,对于a()生成的代码要复杂得多:

>>> dis(a)
  2           0 LOAD_CONST               1 (0)
              3 LOAD_CONST               1 (0)
              6 COMPARE_OP               2 (==)
              9 POP_JUMP_IF_FALSE       16
             12 LOAD_CONST               0 (None)
             15 RETURN_VALUE
        >>   16 LOAD_CONST               0 (None)
             19 RETURN_VALUE

在这种情况下,没有任何东西在编译时进行评估 - 所有操作都在运行时完成。这就是为什么a()要慢得多的原因。

除此之外,我支持@Charles Duffy的评论:在Python中担心微观优化通常是适得其反的。但是,如果你一定要做;-),学习如何使用dis.dis,这样你就不会被生成的代码中的明显差异所迷惑,就像在这个特定的案例中发生的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接