我想知道,什么代码运行得更快?例如,我们有变量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
>>>
我不太明白。
答案 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
,这样你就不会被生成代码中的粗略差异所欺骗,就像在这个特定情况下所发生的那样。