Python 为什么if True比if 1慢?

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

为什么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.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
我被这些事情弄糊涂了:

  • 根据Sylvain Defresne先生在年的回复,所有内容都先隐式转换为
    bool
    ,然后进行检查。那么为什么
    if True
    if 1
    慢呢
  • 为什么
    test3
    test1
    慢,即使只有
    返回值不同
  • 就像问题2,但是为什么
    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比数字1try
    True,False=False,True