Что делает Python itertools.groupby таким быстрым? - PullRequest
0 голосов
/ 05 июля 2018

Я оцениваю последовательные термины последовательности взгляда и произнесения (подробнее об этом здесь: https://en.wikipedia.org/wiki/Look-and-say_sequence).

Я использовал два подхода и рассчитал их оба. В первом подходе я просто перебрал каждый член для создания следующего. Во втором я использовал itertools.groupby(), чтобы сделать то же самое. Разница во времени довольно драматична, поэтому я придумала фигуру для развлечения:

graph

Что делает 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...