Zeitmessung einer Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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
Zuletzt geändert von Gipsyjack am Sonntag 5. Dezember 2010, 17:54, insgesamt 1-mal geändert.
Benutzeravatar
microkernel
User
Beiträge: 271
Registriert: Mittwoch 10. Juni 2009, 17:27
Wohnort: Frankfurt
Kontaktdaten:

die musst die funktionen aufrufen.
Also:

Code: Alles auswählen

fib(1)
fib2(1)
Zuletzt geändert von microkernel am Sonntag 5. Dezember 2010, 17:49, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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...
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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?
rabenstein
User
Beiträge: 8
Registriert: Sonntag 5. Dezember 2010, 14:41

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^^
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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)
Antworten