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

时间:2016-06-12 05:58:12

标签: python

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

我在考虑哪些是最快的处理方式。我只关心处理时间,而不是内存要求。我猜这是第三个,因为在前两种情况下,整个字符串可能需要处理直到最后才能找出字符是否存在,而在第三种情况下,只需要两次比较就足够了整个字符串不需要处理。我猜对了吗?

1 个答案:

答案 0 :(得分: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

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