2012-12-14 172 views
6

我正在做一些关于if语句在循环中的速度以及它们对速度的影响的测试。我发现的一点是,if-statement改善了性能。我的代码:while循环与if语句快于while循环

import time 
t = time.time 

start = t() 
x = 0 
while x < 10000000: 
    x += 1 
time1 = t() 
x = 0 
while x < 10000000: 
    x += 1 
    if True: 
     pass 
time2 = t() 

print(start) 
print(time1 - start) # Time for simple while-loop 
print(time2 - time1) # Time for while+if 

样本输出是:

1355517837.993 
1.7850000858306885 
1.7209999561309814 

这是完全反直觉的。 while-if-loop的工作速度比标准的while循环稍快。几乎每次我运行它都会发生;或许有20分之一需要更长的时间。有谁知道为什么?

+2

如果您从两个定时块中移出x = 0,会发生什么?我敢打赌,你所看到的是解释者必须为第一个块分配'x',而不是第二个块。 –

+0

这里不一样,tho';我有像:$ python t.py 1355519439.65 1.92616391182 2.65010595322';在Python 2.7.3上运行 – Rubens

+0

如果你第一次运行if循环,然后没有它,那么结果是一样的吗?对我来说,第一个总是更快。 – Edu

回答

3

我猜测编译器会删除if True块,因为它是不变的。

当我跑步时,我得到的主要是你的相反结果。我可能只是执行环境的随机效应。

1355519587.2 0.832797050476 1.04382395744

1355519590.03 0.863899946213 1.09347200394

1355519593.72 0.831655025482 1.05389809608

1355519599.71 0.831452131271 1.41783499718

1355519602.99 0.815280914307 1.05724310875

1355519605.72 0.826404094696 1.05700492859

1355519608.94 0.827296972275 1.07807898521

+1

哪个引擎?没有即时编译器或任何东西。至少不在CPython中。事实上,根本没有编译器,我们在这里讨论Python。 –

+0

同意。我的结果是:1355519852.98,0.830796003342,1.11595201492与python 2.7.1 – alexvassel

+0

@TimPietzcker,它是2.7.1。 Python不会编译,而是转换为字节码。您不能在大多数操作环境中执行原始文本。 – Foo

5

的DIS表明,有更多的步骤,而循环中的if语句。

In [4]: dis.dis(t2) 
    2   0 LOAD_CONST    1 (0) 
       3 STORE_FAST    0 (x) 

    3   6 SETUP_LOOP    26 (to 35) 
     >> 9 LOAD_FAST    0 (x) 
      12 LOAD_CONST    2 (10000000) 
      15 COMPARE_OP    0 (<) 
      18 POP_JUMP_IF_FALSE  34 

    4   21 LOAD_FAST    0 (x) 
      24 LOAD_CONST    3 (1) 
      27 INPLACE_ADD 
      28 STORE_FAST    0 (x) 
      31 JUMP_ABSOLUTE   9 
     >> 34 POP_BLOCK 
     >> 35 LOAD_CONST    0 (None) 
      38 RETURN_VALUE 

In [5]: dis.dis(t1) 
    2   0 LOAD_CONST    1 (0) 
       3 STORE_FAST    0 (x) 

    3   6 SETUP_LOOP    35 (to 44) 
     >> 9 LOAD_FAST    0 (x) 
      12 LOAD_CONST    2 (10000000) 
      15 COMPARE_OP    0 (<) 
      18 POP_JUMP_IF_FALSE  43 

    4   21 LOAD_FAST    0 (x) 
      24 LOAD_CONST    3 (1) 
      27 INPLACE_ADD 
      28 STORE_FAST    0 (x) 

    5   31 LOAD_GLOBAL    0 (True) 
      34 POP_JUMP_IF_FALSE  9 

    6   37 JUMP_ABSOLUTE   9 
      40 JUMP_ABSOLUTE   9 
     >> 43 POP_BLOCK 
     >> 44 LOAD_CONST    0 (None) 
      47 RETURN_VALUE 
+0

感谢您发布此消息,我之前并不知道dis模块。然而,while-if-loop的运行速度仍然很快,即使在这个非常低的层次上,它也需要更多的步骤。 – Yos233