Seite 1 von 1

Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 17:39
von Gipsyjack
Hallo, wie der Threadtitel schon sagt will ich die Zeit messen, die die Funktionen für Ihre Durchläufe (für 4<n<17; 4<o<40) braucht.
jedoch wird mir das Ergebniss als hexadezimalzahl ausgegeben, wie kann ich das den ändern?
Die 2 Funktionen sollen verglichen werden.

Hier der Code:

Code: Alles auswählen

#!/usr/bin/python

import math
import time

n=4
o=4

def fib1(n):
	start= time.clock()
	while n <= 17:
		if n <= 1: return 1
		return fib1(n-1)+fib1(n-2)
		n +=1
	ende= time.clock()
	zeit1 = ende-start
	return zeit1
print fib1

def fib2(o, a=1, b=1):
	start= time.clock()
	while o <= 40:
		if n == 0: return a
		elif n == 1: return b
		else: return fib2(n-1, b, a+b)
		o +=1
	ende= time.clock()
	zeit2 = ende-start
	return zeit2
print fib2

Ausgabe:

Code: Alles auswählen

danny@danny:~$ python timeclock.py 
<function fib1 at 0x7ffc38ce45f0>
<function fib2 at 0x7ffc38ceec08>


will das ganze später noch als plot darstellen sow eit bin ich aber noch nicht...

hab auch den Thread hier gefunden:
http://www.python-forum.de/viewtopic.ph ... w=previous

hilft mir jedoch nicht sonderlich viel weiter

EDIT:

habs jetzt noch so:

Code: Alles auswählen

#!/usr/bin/python

import math
import timeit

def fib1(n):
    if n <= 1: return 1
    return fib1(n-1)+fib1(n-2)

def fib2(n, a=1, b=1):
    if n == 0: return a
    elif n == 1: return b
    else: return fib2(n-1, b, a+b)

t1 = timeit.Timer("fib1(4)", "from __main__ import fib1")
t2 = timeit.Timer("fib2(4)", "from __main__ import fib2")

print t1.timeit()
print t2.timeit()

funktioniert wunderbar, würde gerne jedoch wissen, wie es mit tem.clock() geht

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 17:47
von microkernel
die musst die funktionen aufrufen.
Also:

Code: Alles auswählen

fib(1)
fib2(1)

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 17:49
von Darii
Gipsyjack hat geschrieben:jedoch wird mir das Ergebniss als hexadezimalzahl ausgegeben, wie kann ich das den ändern?
Du musst die Funktion auch aufrufen. Das tust du in den Zeilen mit `print` nicht, du gibst nur die Funktion selbst aus. Die Hexadezimalzahl die du da siehst ist einfach die Speicheradresse der Funktion.

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 18:09
von Gipsyjack
Leichtsinnsfehler.. Danke!

Welche der 2 Methoden ist denn am besten um sowas zu plottten??
vorallem wenn ich sowas gegen unendlich laufen lassen will??

EDIT:

weil für kleine Werte ist das ja noch relativ gleich...

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 19:26
von Gipsyjack
Wie schon gesagt wollte ich jetzt die Laufzeiten für wirklich große Werte ermittlen, d.h. fib1(10000) und fib2(100000), jedoch bekomme ich da immer einene Fehler ausgegeben

Code: Alles auswählen

  File "timeclock.py", line 25, in fib2
    else: return fib2(o-1, b, a+b)
RuntimeError: maximum recursion depth exceeded
ist das zu viel für meinen pc oder wie?

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 19:37
von rabenstein
Gipsyjack hat geschrieben:
[/code]

Ausgabe:

Code: Alles auswählen

danny@danny:~$ python timeclock.py 
<function fib1 at 0x7ffc38ce45f0>
<function fib2 at 0x7ffc38ceec08>

t
mich würd aber sehr interessiren wie ich diese ausgabe jetzt in normalen dezimalzahlen ausgeben lasse...das ist genau das problem an dem ich jetzt häng^^

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 19:41
von DasIch
Der Call Stack hat auf CPython ein Limit von 1000, dieses lässt sich mit sys.setrecursionlimit verändern aber ich würde mich zum einen nicht darauf verlassen dass dies bei allen Implementationen vorhanden ist, einwandfrei funktioniert (bei PyPy wird daran gearbeitet dass künstliche Limit zu entfernen wenn sie es nicht schon getan haben, da sind die Funktionen nur dummys) oder dein PC es mitmacht, irgendwo ist eine Grenze und wenn die wirklich erreicht wird stürzt der Interpreter ab.

Verwende einfach eine iterative Lösung (es gibt keine TCO, tail calls zählen hier nicht) und du bist das Problem los.

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 19:48
von Darii
rabenstein hat geschrieben:mich würd aber sehr interessiren wie ich diese ausgabe jetzt in normalen dezimalzahlen ausgeben lasse...das ist genau das problem an dem ich jetzt häng^^
Ist das jetzt der Angriff der Schüler mit Hausaufgabenproblemen? Die Lösung wurde hier schon mehrfach genannt.

Gipsyjack hat geschrieben:ist das zu viel für meinen pc oder wie?
Ja, so in der Art. Python kann nur eine begrenze Anzahl an Funktionsaufrufen ineinander Schachteln. Da deine Funktion rekursiv definiert ist brauchst du bei n=10000 auch 10000 Funktionsaufrufe, das ist zu viel. Du kannst die Berechnung aber auch Iterativ mit einer Schleife schreiben.

Re: Zeitmessung einer Funktion

Verfasst: Sonntag 5. Dezember 2010, 20:05
von Gipsyjack
rabenstein hat geschrieben:
Gipsyjack hat geschrieben:
[/code]

Ausgabe:

Code: Alles auswählen

danny@danny:~$ python timeclock.py 
<function fib1 at 0x7ffc38ce45f0>
<function fib2 at 0x7ffc38ceec08>

t
mich würd aber sehr interessiren wie ich diese ausgabe jetzt in normalen dezimalzahlen ausgeben lasse...das ist genau das problem an dem ich jetzt häng^^
einfach:

Code: Alles auswählen

#!/usr/bin/python

import math
import time

n=1
o=1

def fib1(n):
	start= time.clock()
	while n <= 10000:
		if n <= 1: return 1
		return fib1(n-1)+fib1(n-2)
		n +=1
	ende= time.clock()
	zeit1 = ende-start
	return zeit1
print fib1(17)

def fib2(o, a=1, b=1):
	start= time.clock()
	while o <= 100000:
		if o == 0: return a
		elif o == 1: return b
		else: return fib2(o-1, b, a+b)
		o +=1
	ende= time.clock()
	zeit2 = ende-start
	return zeit2
print fib2(40)