2012-12-14 53 views
6

Tôi đang thực hiện một số thử nghiệm liên quan đến tốc độ của câu lệnh if trong vòng lặp và hiệu ứng của chúng trên tốc độ. Một cái gì đó tôi thấy là nhất quán, hiệu quả cải thiện nếu tuyên bố. Mã của tôi:Khi vòng lặp với if-statement nhanh hơn vòng lặp

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 

Một sản lượng mẫu sẽ là:

1355517837.993 
1.7850000858306885 
1.7209999561309814 

Đó là hoàn toàn phản tác dụng trực quan. Vòng lặp while-if-while hoạt động nhanh hơn một chút so với vòng lặp while chuẩn. Điều này xảy ra hầu như mỗi khi tôi chạy nó; có lẽ 1 trong 20 lần mất nhiều thời gian hơn. Có ai biết tại sao không?

+2

Điều gì sẽ xảy ra nếu bạn di chuyển 'x = 0' ra khỏi cả hai khối thời gian? Tôi đặt cược những gì bạn đang thấy là thông dịch viên phải phân bổ 'x' cho khối đầu tiên nhưng không phải là thứ hai. –

+0

không giống nhau ở đây, tho '; tôi có thời gian như: '$ python t.py 1355519439.65 1.92616391182 2.65010595322'; chạy trên Python 2.7.3 – Rubens

+0

Là kết quả tương tự nếu bạn lần đầu tiên chạy vòng lặp if và sau đó là một mà không có nó? Đối với tôi, cái đầu tiên luôn luôn nhanh hơn. – Edu

Trả lời

3

Tôi đoán rằng trình biên dịch sẽ xóa khối True nếu nó không đổi.

Khi tôi chạy, tôi nhận được hầu hết các kết quả ngược lại từ bạn. Tôi chỉ có thể là hiệu ứng ngẫu nhiên của môi trường thực hiện.

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

Động cơ nào? Không có trình biên dịch chỉ trong thời gian hay bất cứ thứ gì. Ít nhất không phải trong CPython.Trong thực tế, không có trình biên dịch nào cả, chúng ta đang nói về Python ở đây. –

+0

đồng ý. kết quả của tôi là: 1355519852.98, 0.830796003342, 1.11595201492 với python 2.7.1 – alexvassel

+0

@TimPietzcker, là 2.7.1. Python biên dịch, nhưng thành bytecode. Bạn không thể thực thi văn bản thô trong hầu hết các môi trường hoạt động. – Foo

5

Các dis cho thấy rằng có nhiều bước để câu lệnh if trong khi vòng lặp.

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

Cảm ơn bạn đã đăng bài này, tôi đã không nhận thức được mô-đun dis trước đây. Tuy nhiên nó vẫn còn khó hiểu rằng trong khi-if-loop chạy nhanh hơn, ngay cả ở mức độ rất thấp này, nó cần nhiều bước hơn. – Yos233

Các vấn đề liên quan