2016-12-06 69 views
4

這裏有兩個函數可以完全相同,但是有誰知道爲什麼使用count()方法的方法比另一個方法快得多? (我的意思是它的工作原理又是如何構建?)爲什麼count()方法比for循環python更快

如果可能的話,我想比一個更容易理解的答案怎麼在這裏找到:Algorithm used to implement the Python str.count function 或什麼的源代碼:https://hg.python.org/cpython/file/tip/Objects/stringlib/fastsearch.h

def scoring1(seq): 
    score = 0 
    for i in range(len(seq)): 
     if seq[i] == '0': 
      score += 1  
    return score 

def scoring2(seq): 
    score = 0 
    score = seq.count('0') 
    return score 

seq = 'AATTGGCCGGGGAG0CTTC0CTCC000TTTCCCCGGAAA' 
# takes 1min15 when applied to 100 sequences larger than 100 000 characters 
score1 = scoring1(seq) 
# takes 10 sec when applied to 100 sequences larger than 100 000 characters 
score2 = scoring2(seq) 

非常感謝您的回覆

+14

簡短的回答是因爲一羣非常聰明的人從python發佈以來一直在優化內建'count()'功能 –

+0

你試過這個電腦嗎?我的顯然是比你快100-200倍。另外,爲什麼unpythonic索引循環?你**試圖讓它變慢嗎? –

+1

[用於實現Python str.count函數的算法]的可能重複(http://stackoverflow.com/questions/16806972/algorithm-used-to-implement-the-python-str-count-function) –

回答

3

@CodeMonkey已經給出了答案,但它可能是有趣的,你的第一個功能可以改進,使之運行速度更快約20%:

import time, random 

def scoring1(seq): 
    score=0 
    for i in range(len(seq)): 
     if seq[i]=='0': 
      score+=1  
    return score 

def scoring2(seq): 
    score=0 
    for x in seq: 
     score += (x =='0')  
    return score 

def scoring3(seq): 
    score = 0 
    score = seq.count('0') 
    return score 

def test(n): 
    seq = ''.join(random.choice(['0','1']) for i in range(n)) 
    functions = [scoring1,scoring2,scoring3] 
    for i,f in enumerate(functions): 
     start = time.clock() 
     s = f(seq) 
     elapsed = time.clock() - start 
     print('scoring' + str(i+1) + ': ' + str(s) + ' computed in ' + str(elapsed) + ' seconds') 

test(10**7)  

典型輸出:

scoring1: 5000742 computed in 0.9651326495293333 seconds 
scoring2: 5000742 computed in 0.7998054195159483 seconds 
scoring3: 5000742 computed in 0.03732172598339578 seconds 

前兩種方法都被內置的count()吹走。

道德故事:當您使用已優化的內置方法的而不是時,您需要優化自己的代碼。

+0

下次使用'timeit' –

+0

@Chris_Rands這是個好主意 - 但我有時候會用'時間',如果我對球場的形象感到滿意的話。 –

4

因爲count是在底層本機實現中執行的。 for循環以較慢的解釋代碼執行。

相關問題