Beyond, ich habe mir mal erlaubt in deinem Sourcecode die print Befehle umzubauen. Jetzt kommt die Ausgabe tabellarisch, was die Vergleichbarkeit der Werte leichter macht.
Code: Alles auswählen
from time import clock
from math import sqrt
max = 1000000
measurements= 20
student= { # Student-Funktion/sqrt(n) fuer eine Sicherheit von 68,26 %
4: 0.6,
10: 0.34,
20: 0.23
}
rtWhileArr= range(measurements)
rtForArr= range(measurements)
print "\n\n\n\n\n\n\n\nTeste Whileschleife"
print "i = 0"
print "while i < %d:" % max
print " pass"
print " i = i+1\n"
print "Teste Forschleife"
print "for i in range (%d):" % max
print " pass\n\n\n"
print "MESSUNG %3s %9s %9s" % ("Nr", "WHILE", "FOR")
for iR in range(measurements):
a = clock()
i = 0
while i < max:
pass
i = i + 1
b = clock()
lzw = b-a
rtWhileArr[iR]= lzw
a = clock()
for i in range(max):
pass
b = clock()
lzf = b-a
print "MESSUNG %3d %9.3f %9.3f" % (iR+1, lzw, lzf)
rtForArr[iR]= lzf
lzw= 0
for lzwR in rtWhileArr:
lzw= lzw + lzwR
lzw= float(lzw)/float(measurements)
stAbw= 0
for lzwR in rtWhileArr:
stAbw= stAbw + ((lzwR - lzw)**2)
stAbw= sqrt(float(stAbw)/float(measurements-1))
delta_lzw= stAbw * student[measurements]
lzf= 0
for lzfR in rtForArr:
lzf= lzf + lzfR
lzf= float(lzf)/float(measurements)
stAbw= 0
for lzfR in rtForArr:
stAbw= stAbw + ((lzfR - lzf)**2)
stAbw= sqrt(float(stAbw)/float(measurements-1))
delta_lzf= stAbw * student[measurements]
print "Durschnittliche Dauer einer Whileschleife: %.3f +/- %.3f sek " % (lzw, delta_lzw)
print "Durschnittliche Dauer einer Forschleife: %.3f +/- %.3f sek " % (lzf, delta_lzf)
if lzw > lzf:
print "Eine Forschleife ist %.2f mal schneller als eine Whileschleife" % (lzw/lzf)
else:
print "Eine Whileschleife ist %.2f mal schneller als eine Forschleife" % (lzf/lzw)
print
relError= sqrt( ((delta_lzw/lzw)**2) + ((delta_lzf/lzf)**2) )*100
print "Dieses Ergebnis weicht mit einer Sicherheit von 68,26%% nicht mehr als %.2f%% vom wahren Wert ab" % relError
Das Ergebnis sieht bei mir dann so aus:
Code: Alles auswählen
Teste Whileschleife
i = 0
while i < 1000000:
pass
i = i+1
Teste Forschleife
for i in range (1000000):
pass
MESSUNG Nr WHILE FOR
MESSUNG 1 4.150 2.250
MESSUNG 2 4.220 2.220
MESSUNG 3 4.000 2.240
MESSUNG 4 4.140 2.350
MESSUNG 5 3.960 2.260
MESSUNG 6 4.060 2.250
MESSUNG 7 4.070 2.240
MESSUNG 8 4.040 2.110
MESSUNG 9 4.100 2.240
MESSUNG 10 4.030 2.190
MESSUNG 11 4.120 2.210
MESSUNG 12 4.060 2.260
MESSUNG 13 4.070 2.260
MESSUNG 14 4.110 2.230
MESSUNG 15 4.080 2.490
MESSUNG 16 3.960 2.200
MESSUNG 17 3.990 2.270
MESSUNG 18 4.200 2.260
MESSUNG 19 4.200 2.390
MESSUNG 20 4.250 2.550
Durschnittliche Dauer einer Whileschleife: 4.090 +/- 0.019 sek
Durschnittliche Dauer einer Forschleife: 2.273 +/- 0.023 sek
Eine Forschleife ist 1.80 mal schneller als eine Whileschleife
Dieses Ergebnis weicht mit einer Sicherheit von 68,26% nicht mehr als 1.13% vom wahren Wert ab
hans@poorbill:~/tmp>
Ich trage meine versionen mal nach:
Code: Alles auswählen
Zur Messung wurde Python "2.2.1 (#1, Sep 10 2002, 17:49:17)
[GCC 3.2]" auf "linux2" benutzt
Hans