Project Eulerの質問14には次のコードを使用しました。この質問を知らない人は、「ステップ」の数が最大で100万以下の数字を見つけなければなりません。そのCollatzシーケンスで。Python、ProjectEuler、最適化によりコードが遅くなります
largen = 0
for i in range (1, 1000000):
n = 0
k = i
while k != 1:
if k % 2 == 0:
k = k/2
n = n+1
else:
k = 3*k+1
n = n+1
if n > largen:
largen = n
answer = i
print "Value with highest number of terms in collatz sequence is %d which has %d terms in its collatz sequence." % (answer, largen)
これは私に約1m20sで正しい答えを与えます。しかし、私はこれを次のようにスピードアップできると思った。最初に、プログラムは、各値iについてcollatzシーケンスのステップ数を覚えておくように指示しました。次に、数kのための配列を見つける過程の中で、私が前の数に乗っているならば、私はその配列を計算しました。今のところk。
たとえば、シーケンスのステップ数を13として計算しようとしているとします。最初の3ステップは13-40-20-10です。今私はすでに10のシーケンスのステップ数は6であると計算しました(10-5-16-8-4-2-1)。したがって、13のシーケンスのステップ数は、10から1になるために必要な6に加えられる10に達するために取られた3、すなわち合計9ステップである。
この目的を達成するために、私は次のようにコードを修正:私は試してみて、これを実行すると
nterms = [] # for each value i, contains number of terms in collatz sequence
used = [] # list of used values of i (so can add nterms[i-1] to collatz sequence which redirects to i)
largen = 0
for i in range (1, 1000000):
n = 0
k = i
while k != 1:
if k in used:
n = n+nterms[k-1]
break
elif k % 2 == 0:
k = k/2
n = n+1
else:
k = 3*k+1
n = n+1
if n > largen:
largen = n
answer = i
used.append(i)
nterms.append(n)
print "Value with highest number of terms in collatz sequence is %d which has %d terms in its collatz sequence." % (answer, largen)
は、しかし、私はMemoryErrorが端末画面にoutprinted得ます。小さな値(つまり10000まで)を試すと、元のコードと同じ回答が得られますが、はるかにゆっくりします(つまり、1秒ではなく7秒かかる)。
どうしてですか?
'list'ではなく' used'に 'set'を使用してください!あるいは、 'used'を全く使わず、' if k schwobaseggl