以下哪一个是检查角色案例的最快方法?
问题描述:
我正在从头学习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应该是最快的处理。我只关心处理时间,而不是内存需求。我猜测它是第三个,因为在前两种情况下,整个字符串可能需要处理直到结束,以查明字符是否存在,而在第三种情况下,只有两个比较是足够的,并且整个字符串不需要处理。那么我的猜测是对的?
答
下面是一个使用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
它可以清楚地看到,最后的方法是最快的,而第一个是最慢的。
你为什么不测试它们?运行1,000,000次每个功能并测量已用时间。 – deepmax
你不用什么内置的'ch.islower()'?不需要写你自己的。 –
@deepmax我还没有达到那个水平,我可以准确地测量某个函数执行所花费的时间。理论上,我确实可以多次运行不同的方式,然后测量差异,但在这种情况下,处理器也应该在所有3次测试运行期间同样空闲,而这对我来说实际上是不可能的。 – Hiren