什么是更快,`如果x`或`如果x!= 0`?

时间:2016-07-03 17:25:07

标签: python

我想知道,什么代码运行得更快?例如,我们有变量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
>>>

我不太明白。

1 个答案:

答案 0 :(得分:15)

这很难在评论中显示:这里发表的内容比(或更少;-)更多,而不是迄今为止提到的任何评论。在您展示的情况下定义了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,这样你就不会被生成代码中的粗略差异所欺骗,就像在这个特定情况下所发生的那样。