是什么让python的itertools.groupby如此之快?

时间:2018-07-04 23:13:30

标签: python python-3.x iteration itertools

我正在评估外观序列的连续术语(有关更多信息,请访问https://en.wikipedia.org/wiki/Look-and-say_sequence)。

我使用了两种方法并对两者进行计时。在第一种方法中,我仅遍历每个术语来构造下一个。在第二篇文章中,我使用itertools.groupby()进行了同样的操作。时差非常明显,所以我做了一个有趣的人物:

graph

是什么使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)

0 个答案:

没有答案