Я оцениваю последовательные термины последовательности взгляда и произнесения (подробнее об этом здесь: https://en.wikipedia.org/wiki/Look-and-say_sequence).
Я использовал два подхода и рассчитал их оба. В первом подходе я просто перебрал каждый член для создания следующего. Во втором я использовал itertools.groupby()
, чтобы сделать то же самое. Разница во времени довольно драматична, поэтому я придумала фигуру для развлечения:
Что делает itertools.groupby()
таким эффективным? Код для двух подходов ниже:
1-й подход:
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)
2-й подход:
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)