Die Terme der Fibonacci-Sequenz sind die Summe der beiden vorhergehenden Terme. Wenn die ersten beiden Terme 1, 2 sind, sind die ersten 10 Terme:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... Suchen Sie die Summe der geradzahligen Begriffe mit einem Zahlenspaltenwert von 4 Millionen oder weniger. http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202
Zuerst habe ich den Code geschrieben, als ich ihn mir ausgedacht habe.
def cof():
(v1, v2) = (1, 2)
max = 4 * (10**6)
s = 0
while v2<=max:
if not v2 % 2: s += v2
(v1, v2) = (v2, v1+v2)
print s
Als ich mir das Problem ansah, ob es etwas gab, das beschleunigt werden konnte, bemerkte ich, dass alle drei Begriffe gerade Zahlen auftauchten.
Wenn n1 der Term vor dem geraden Term ist und n2 der gerade Term ist, können die ihnen folgenden Terme n3, n4, n5 durch die folgenden Gleichungen ausgedrückt werden.
n4 wird benötigt, um den nächsten Term abzuleiten, aber n3 kann wahrscheinlich weggelassen werden! Wenn Sie sich für gerade Begriffe entscheiden, sollten Sie außerdem die if-Anweisung weglassen können, die bestimmt, ob sie gerade ist oder nicht!
Also habe ich den folgenden Code geschrieben.
def cof2():
(v1, v2) = (1, 2)
max = 4 * (10**6)
s = 0
while v2 <= max:
s += v2
(v1, v2) = (v1+2*v2, 2*v1+3*v2)
print s
Ich habe den Druck auskommentiert und die Zeit mit dem folgenden Code gemessen.
def get_time(func,name,num):
import time
print "%s start." % name
total = 0
for i in range(0,num):
start = time.time()
func()
end = time.time()
total += end - start
print "%s finished." % name
print total
if __name__ == '__main__':
num = 10 ** 6
#num = 1
get_time(cof,"cof",num)
get_time(cof2,"cof2",num)
Infolgedessen sparten 1 Million Läufe 2,21 Sekunden (2,21 Mikrosekunden pro Lauf).
Sparen Sie 221 Sekunden (ca. 3 Minuten und 40 Sekunden), indem Sie 100 Millionen Mal ausführen! Große Einsparungen!
Ich habe ungefähr 15 Minuten gebraucht, um neuen Code zu schreiben, da es sich um einen Code handelt, den ich nur einmal in meinem Leben ausgeführt habe.
Recommended Posts