我正在评估外观序列的连续术语(有关更多信息,请访问https://en.wikipedia.org/wiki/Look-and-say_sequence)。
我使用了两种方法并对两者进行计时。在第一种方法中,我仅遍历每个术语来构造下一个。在第二篇文章中,我使用itertools.groupby()
进行了同样的操作。时差非常明显,所以我做了一个有趣的人物:
是什么使itertools.groupby()
如此高效?两种方法的代码如下:
第一种方法:
def find_block(seq):
block = [seq[0]]
seq.pop(0)
while seq and seq[0] == block[0]:
block.append(seq[0])
seq.pop(0)
return block
old = list('1113222113')
new = []
version1_time = []
for i in range(40):
start = time.time()
while old:
block = find_block(old)
new.append(str(len(block)))
new.append(block[0])
old, new = new, []
end = time.time()
version1_time.append(end-start)
第二种方法:
seq = '1113222113'
version2_time = []
def lookandread(seq):
new = ''
for value, group in itertools.groupby(seq):
new += '{}{}'.format(len(list(group)), value)
return new
for i in range(40):
start = time.time()
seq = lookandread(seq)
end = time.time()
version2_time.append(end-start)