2013-08-05 7 views
5

जब मैंअजगर में क्यों अगर रैंक: अगर तुलना में तेजी है रैंक = 0:

for i in range(0, 100): 
    rank = ranks[i] 
    if rank != 0: 
     pass 
को

बदल दिया है:

for i in range(0, 100): 
    rank = ranks[i] 
    if rank: 
     pass 

मैंने पाया दूसरा कोड और अधिक कुशल है, क्यों?

बेंच इसे चिह्नित करता है, और मेरी स्थिति में रैंक पूर्णांक की एक संख्यात्मक सरणी है। अंतर बहुत अधिक है।

import numpy as np 
import time 
N = 1000000 
ranks = np.random.random_integers(0, 10, N) 
start = time.time() 
for i in range(0, N): 
    rank = ranks[i] 
    if rank != 0: 
     pass 

print time.time() - start 
start = time.time() 
for i in range(0, N): 
    rank = ranks[i] 
    if rank: 
     pass 
print time.time() - start 
start = time.time() 
for i in range(0, N): 
    if i != 0: 
     pass 

print time.time() - start 
start = time.time() 
for i in range(0, N): 
    if i: 
     pass 
print time.time() - start 

उत्पादन:

1.15917396545 
0.45020198822 
0.123136997223 
0.122531175613 
+7

आप कैसे मिला है? क्या आपने बेंचमार्क किया था? – zsong

+0

मुझे थोड़ा बढ़ावा मिलेगा, क्योंकि कम से कम काम पाइथन में होता है और इसमें से अधिकतर अंतर्निहित तरीकों से होता है, लेकिन वास्तविक कार्यक्रम में, यह शायद बड़ा नहीं होगा। (यह अभी भी करने लायक है, क्योंकि यह मानक शैली और कम कोड है।) – user2357112

उत्तर

8

कोर करने के लिए जाँच करता है आसवन

for i in range(0,100): 
    if i != 0: 
    pass 

और

for i in range(0,100): 
    if i: 
    pass 

हम देखते हैं कि वहाँ एक अंतर

012 है
$ python -m timeit 'for i in range(0,100):' ' if i != 0:' ' pass' 
100000 loops, best of 3: 4.69 usec per loop 
$ python -m timeit 'for i in range(0,100):' ' if i:' ' pass' 
100000 loops, best of 3: 4.18 usec per loop 

अंतर यह है कि पहले मामले में शून्य की तुलना करना शामिल है, दूसरा मामला सिर्फ गलत होने पर परीक्षण करता है।

देखने के लिए यह क्या कर रहा है, dis का उपयोग करें:

>>> def f(): 
... for i in range(0,100): 
... if i: 
...  pass 
... 
>>> def g(): 
... for i in range(0,100): 
... if i != 0: 
...  pass 
... 
>>> from dis import dis 
>>> dis(f) 
    2   0 SETUP_LOOP    32 (to 35) 
       3 LOAD_GLOBAL    0 (range) 
       6 LOAD_CONST    1 (0) 
       9 LOAD_CONST    2 (100) 
      12 CALL_FUNCTION   2 
      15 GET_ITER 
     >> 16 FOR_ITER    15 (to 34) 
      19 STORE_FAST    0 (i) 

    3   22 LOAD_FAST    0 (i) 
      25 POP_JUMP_IF_FALSE  16 

    4   28 JUMP_ABSOLUTE   16 
      31 JUMP_ABSOLUTE   16 
     >> 34 POP_BLOCK 
     >> 35 LOAD_CONST    0 (None) 
      38 RETURN_VALUE 
>>> dis(g) 
    2   0 SETUP_LOOP    38 (to 41) 
       3 LOAD_GLOBAL    0 (range) 
       6 LOAD_CONST    1 (0) 
       9 LOAD_CONST    2 (100) 
      12 CALL_FUNCTION   2 
      15 GET_ITER 
     >> 16 FOR_ITER    21 (to 40) 
      19 STORE_FAST    0 (i) 

    3   22 LOAD_FAST    0 (i) 
      25 LOAD_CONST    1 (0) <-- this only happens in != 0 
      28 COMPARE_OP    3 (!=) <-- this only happens in != 0 
      31 POP_JUMP_IF_FALSE  16 

    4   34 JUMP_ABSOLUTE   16 
      37 JUMP_ABSOLUTE   16 
     >> 40 POP_BLOCK 
     >> 41 LOAD_CONST    0 (None) 
      44 RETURN_VALUE 
+0

मैं अपनी स्थिति, रैंक numpy का एक पूर्णांक सरणी है। ऐसा लगता है कि अंतर बहुत अधिक है। – BerSerK

+0

यदि आप दोनों नमूने 'डी' करते हैं, तो अंतर अभी भी 'LOAD_CONST 1 (0)' और 'COMPARE_OP 3 (! =)' है। – SheetJS

+0

लेकिन, अगर आप 'i'= True' के साथ' if' को प्रतिस्थापित करते हैं, तो कैसे समझाया जाए? उत्तरार्द्ध, काफी बस भी धीमी – zsong

संबंधित मुद्दे