2016-10-06 3 views
0

私は面白いことに、自分のスキルに取り組むためにコーディングのチャレ​​ンジをしています。昨年12月からのAdvent of Codeの挑戦を覚えている人もいます。私は問題の解決策としてこのコードを持っていますが、それはうまく機能しませんが、無駄な速度です。このPythonコードを最適化するにはどうすればよいですか?

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文字になり、コードは妥当な時間で長い文字列を処理するのに十分最適化されていません。誰かが私にいくつかのポインタを与えることができますか?

+7

質問[codereview.se]のためのより良いフィット感です。 –

+1

_「昨年12月からのAdvent of Codeの挑戦を覚えている人もいるかもしれません」 - 残念ですが、私はそうではありません。ところで、この質問は、[Code Review](http://codereview.stackexchange.com/)のほうが適しています。 –

+0

昨年は挑戦的なサイトです。特に重要なことではありません。それはまだ周りですので、私はもう少しそれに取り組むことにしました。あなたはadventofcode.comで見つけることができます。これは10日目の挑戦です。 –

答えて

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

+1

という余分なスペースを無駄にするのではなく、 'sum(1 for _ in g)'と同じ結果を得ることができます。それは文字列に... – Copperfield

+0

@Copperfield良い点、私はその 'list'呼び出しを回避する方法を考えていました。 –

関連する問題