如何优化此Python代码?

时间:2016-10-06 15:07:14

标签: python optimization

我正在进行编码挑战以获得乐趣并努力学习我的技能 - 你们中的一些人可能还记得去年12月的“代码问世”挑战,我正在努力解决这个问题。我已经将这段代码作为解决其中一个问题的解决方案,但是它运行缓慢。

inp = "1113122113"

def iterate(num):
    pos = 0
    new = ""
    while pos < len(num):
        counter = 0
        d = num[pos]
        for i in range(pos, len(num)):
            if num[i] == d:
                counter += 1
            else:
                break
        new+=str(counter)
        new+=str(d)
        pos += counter
    print len(new)
    return new

for i in range (50):
    inp = iterate(inp)

过去的迭代35左右,它达到了每次迭代花费几分钟的程度。目标是生成一个看起来顺序的序列 - 所以1到11,然后是21,1211,111221,3112211等等。我需要在第50次迭代后找到字符串的长度,但是在40次迭代之后它长达360154个字符并且我的代码没有足够优化来处理在合理时间内长的字符串。谁能给我一些指示?

1 个答案:

答案 0 :(得分:1)

使用itertools.groupby会非常快。

from itertools import groupby
def next_say(s):
    return ''.join(str(sum(1 for _ in g))+k for k, g in groupby(s))

def iterate(num):
    """Generator that yields the first num iterations"""
    val = '1'
    for i in range(num):
        val = next_say(val)
        yield val

https://docs.python.org/2/library/itertools.html#itertools.groupby