Ich habe den folgenden Code verwendet, um Projekt Euler Frage 14 anzugehen. Für diejenigen, die diese Frage nicht kennen, muss ich die Zahl unter einer Million mit der größten Anzahl von "Schritten" finden in seiner Collatz-Sequenz.Python, ProjectEuler, Optimierung macht Code langsamer
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)
Dies gibt mir die richtige Antwort in etwa 1m20s. Ich dachte jedoch, ich könnte das auf folgende Weise beschleunigen. Zuerst wies ich das Programm an, die Anzahl der Schritte in der Kollaz-Sequenz für jeden Wert i zu speichern. Wenn ich dann beim Finden der Sequenz für eine Zahl k auf einer vorherigen Zahl lande, für die ich die Sequenz berechnet habe, würde ich einfach die Anzahl der Terme in der Folge für i zu der Zahl addieren, die ich berechnet habe so weit für k.
Zum Beispiel, sagen wir, ich versuche, die Anzahl der Schritte in der Reihenfolge für 13 zu berechnen. Die ersten 3 Schritte sind 13-40-20-10. Jetzt habe ich bereits berechnet, dass die Anzahl der Schritte in der Sequenz für 10 6 (10-5-16-8-4-2-1) ist. So ist die Anzahl der Schritte in der Sequenz für 13 die 3, die benötigt wird, um zu 10 zu kommen, die benötigt werden, um von 10 zu 1 zu kommen, d. H. Insgesamt 9 Schritte.
Zu diesem Zweck geändert ich den Code auf die folgenden:
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)
aber wenn ich versuche, und führen Sie diese ich Memory auf dem Terminal-Bildschirm outprinted. Wenn ich kleinere Werte (d. H. Bis zu 10000) versuche, bekomme ich die gleiche Antwort wie mein ursprünglicher Code, aber viel langsamer (d. H. Dauert 7 Sekunden im Gegensatz zu 1 Sekunde).
Warum passiert das?
Verwenden Sie ein 'set' für' used', nicht eine 'liste'! Oder noch besser, benutze 'used' überhaupt nicht und ersetze' if k in used' durch 'if k schwobaseggl