以下哪一个是检查角色案例的最快方法?

以下哪一个是检查角色案例的最快方法?

问题描述:

我正在从头学习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

下面是一个使用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 

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