[英]Why is if True slower than if 1?
为什么if True
比Python中的if 1
慢? if True
比if 1
更快,不应该吗?
我试图学习timeit
模块。 从基础知识开始,我尝试了以下方法:
>>> def test1():
... if True:
... return 1
... else:
... return 0
>>> print timeit("test1()", setup = "from __main__ import test1")
0.193144083023
>>> def test2():
... if 1:
... return 1
... else:
... return 0
>>> print timeit("test2()", setup = "from __main__ import test2")
0.162086009979
>>> def test3():
... if True:
... return True
... else:
... return False
>>> print timeit("test3()", setup = "from __main__ import test3")
0.214574098587
>>> def test4():
... if 1:
... return True
... else:
... return False
>>> print timeit("test4()", setup = "from __main__ import test4")
0.160849094391
我对这些事感到困惑:
bool
,然后进行检查。 那么为什么if True
比if 1
慢? test3
比test1
慢,即使return
值不同? test4
比test2
快一点? 注意:我运行了三次timeit
并取结果的平均值,然后将这些时间与代码一起发布。
这个问题与如何进行微基准测试无关(我在这个例子中做了但我也明白它太基础了),但为什么检查'True'变量比常量慢。
True
和False
不是Python 2中的关键字。
他们必须在运行时解决。 这已在Python 3中更改
Python 3上的相同测试:
>>> timeit.timeit('test1()',setup="from __main__ import test1", number=10000000)
2.806439919999889
>>> timeit.timeit('test2()',setup="from __main__ import test2", number=10000000)
2.801301520000038
>>> timeit.timeit('test3()',setup="from __main__ import test3", number=10000000)
2.7952816800000164
>>> timeit.timeit('test4()',setup="from __main__ import test4", number=10000000)
2.7862537199999906
时间误差为1%,这是可以接受的。
字节拆卸使得差异明显。
>>> dis.dis(test1)
2 0 LOAD_GLOBAL 0 (True)
3 JUMP_IF_FALSE 5 (to 11)
6 POP_TOP
3 7 LOAD_CONST 1 (1)
10 RETURN_VALUE
>> 11 POP_TOP
5 12 LOAD_CONST 2 (0)
15 RETURN_VALUE
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
正如Kabie所提到的, True
和False
是Python 2中的全局变量。许多东西正在进行访问。
>>> dis.dis(test2)
3 0 LOAD_CONST 1 (1)
3 RETURN_VALUE
Python编译器能够将1
识别为一个不断“真实”的表达并优化冗余条件!
>>> dis.dis(test3)
2 0 LOAD_GLOBAL 0 (True)
3 JUMP_IF_FALSE 5 (to 11)
6 POP_TOP
3 7 LOAD_GLOBAL 0 (True)
10 RETURN_VALUE
>> 11 POP_TOP
5 12 LOAD_GLOBAL 1 (False)
15 RETURN_VALUE
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
与test1
几乎相同,还有一个LOAD_GLOBAL
。
>>> dis.dis(test4)
3 0 LOAD_GLOBAL 0 (True)
3 RETURN_VALUE
见test2
。 但是LOAD_GLOBAL
比LOAD_CONST
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.