Python 为什么if True比if 1慢?
为什么Python中的Python 为什么if True比if 1慢?,python,performance,if-statement,boolean,timeit,Python,Performance,If Statement,Boolean,Timeit,为什么Python中的if-True比if-1慢?如果为真不应该比如果为1快吗 我试图学习timeit模块。从基础开始,我尝试了以下几点: >>> def test1(): ... if True: ... return 1 ... else: ... return 0 >>> print timeit("test1()", setup = "from __main__ import test1") 0.193
if-True
比if-1
慢?如果为真
不应该比如果为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
慢,即使只有返回值不同
test4
比test2
快一点呢timeit
,取结果的平均值,然后将时间和代码一起发布到这里
这个问题与如何进行微观基准测试无关(我在本例中进行了微基准测试,但我也知道它太基本了),但为什么检查“真”变量比检查常量慢。
True
和False
不是其中的关键字
它们必须在运行时解析。这一点在过去有所改变
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\u GLOBAL
>>> dis.dis(test4)
3 0 LOAD_GLOBAL 0 (True)
3 RETURN_VALUE
请参见
test2
。但是LOAD\u GLOBAL
比LOAD\u CONST
要贵一些,我认为您的测试太小了。三次运行的平均值是不够的:pI了解:)即使测试用例太基本,也无法思考。然而,我们需要从正确的地方开始:)可能重复@JarrodRoberson,谢谢链接:-)然而,我的问题与一般的微基准无关。这是关于为什么使用关键字检查布尔值比检查常量慢。True比数字1tryTrue,False=False,True