我正在从头开始学习Python。同样,我正在使用《如何像计算机科学家一样思考》一书。同一的第 7.12 节涉及字符分类,它列出了 3 种不同的方法来确定是否给定字符 (ch) 为小写,如下所示:
1.
def is_lower(ch):
return string.find(string.lowercase, ch) != -1
阿拉伯数字。
def is_lower(ch):
return ch in string.lowercase
3.
def is_lower(ch):
return 'a' <= ch <= 'z'
我在想其中哪一个是最快的处理速度。我只关心处理时间,而不关心内存要求。我猜这是第三种,因为在前两种情况下,可能需要处理整个字符串直到最后才能找出该字符是否存在,而在第三种情况下,只需两次比较就足够了,整个字符串不需要处理。那么我的猜测是对的吗?
以下是
我使用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
可以清楚地看到,最后一种方法是最快的,而第一种方法是最慢的。