2016-06-12 94 views
0

我正在從頭學習Python。同樣,我正在使用書'How To Think Like a Computer Scientist'。與字符分類相同的交易的第7.12節和它列出3種不同的確定 給定字符(CH)是否是小寫的方式,如下所示:以下哪一個是檢查角色案例的最快方法?

1.

def is_lower(ch):  
     return string.find(string.lowercase, ch) != -1 

2.

 def is_lower(ch): 
     return ch in string.lowercase 

3.

 def is_lower(ch): 
     return 'a' <= ch <= 'z' 

我在想這些,其中,W應該是最快的處理。我只關心處理時間,而不是內存需求。我猜測它是第三個,因爲在前兩種情況下,整個字符串可能需要處理直到結束,以查明字符是否存在,而在第三種情況下,只有兩個比較是足夠的,並且整個字符串不需要處理。那麼我的猜測是對的?

+3

你爲什麼不測試它們?運行1,000,000次每個功能並測量已用時間。 – deepmax

+2

你不用什麼內置的'ch.islower()'?不需要寫你自己的。 –

+0

@deepmax我還沒有達到那個水平,我可以準確地測量某個函數執行所花費的時間。理論上,我確實可以多次運行不同的方式,然後測量差異,但在這種情況下,處理器也應該在所有3次測試運行期間同樣空閒,而這對我來說實際上是不可能的。 – Hiren

回答

0

下面是一個使用timeit我的測試代碼:

import string 
import timeit 
import random 

def is_lower(ch): 
    return string.find(string.lowercase, ch) != -1 

def is_lower1(ch): 
    return ch in string.lowercase 

def is_lower2(ch): 
    return 'a' <= ch <= 'z' 

def wrapper(func, *args, **kwargs): 
    def wrapped(): 
     return func(*args, **kwargs) 
    return wrapped 

for i in range(100): 
    lt = random.choice(string.letters) 
    wrappered1 = wrapper(is_lower, lt) 
    wrappered2 = wrapper(is_lower1, lt) 
    wrappered3 = wrapper(is_lower2, lt) 
    t1, t2, t3 = [], [], [] 
    t1 += timeit.repeat(wrappered1, repeat=3, number=100000) 
    t2 += timeit.repeat(wrappered2, repeat=3, number=100000) 
    t3 += timeit.repeat(wrappered3, repeat=3, number=100000) 

print 't1: ', sum(t1)/len(t1) 
print 't2: ', sum(t2)/len(t2) 
print 't2: ', sum(t3)/len(t3) 

輸出:

Out[44]: 
t1: 0.0781290027991 
t2: 0.0348194339546 
t2: 0.0307262024573 

它可以清楚地看到,最後的方法是最快的,而第一個是最慢的。

相關問題