[Python] Zeitmessung mit timeit

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von Nemesis, 17.02.2010.

  1. #1 Nemesis, 17.02.2010
    Nemesis

    Nemesis N3RD

    Dabei seit:
    28.01.2005
    Beiträge:
    2.165
    Zustimmungen:
    0
    Hi,
    ich würde gerne messen, wieviel ms eine Funkion in anspruch nimmt.
    an sich sollte das, wie hier beschrieben mit timeit funktionieren.

    ich habe die funktion die aufgerufen wird wie folgt definiert:
    Code:
         def dotime(self):
              t = timeit.Timer("draw()","from __main__ import *")
              time = t.timeit(1)
              print "took %fs\n" % (time,)
    wobei draw() dann die funktion ist, bei der die zeit gemessen werden soll.

    aber ich bekomme dann folgenden error:
    Code:
    Traceback (most recent call last):
      File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1417, in __call__
        return self.func(*args)
      File "~/Projects/python-foobar/src/python_foobar.py", line 31, in dotime
        time = t.timeit(1)
      File "/usr/lib/python2.5/timeit.py", line 161, in timeit
        timing = self.inner(it, self.timer)
      File "<timeit-src>", line 6, in inner
    NameError: name 'draw' is not defined
    
    kennt sich jemand mit Zeitmessung aus?

    danke !
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 17.02.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    Wie war das doch gleich mit 'from foo import *'? ;)
    Probier es mal mit 'from __main__ import draw'; wenn draw existiert, sollte das funktionieren.
    Ansonsten benutze ich persoenlich auch immer gern das Unix Programm time, wenn ich schnell ein paar Codeschnipsel auf Performance testen will ('$ time python foo.py').

    mfg,
    bytepool
     
  4. #3 Nemesis, 18.02.2010
    Nemesis

    Nemesis N3RD

    Dabei seit:
    28.01.2005
    Beiträge:
    2.165
    Zustimmungen:
    0
    ich habs auch schon mit t = timeit.Timer("draw()","from __main__ import draw") probiert, aber das ging auch net.
    draw() ist eine methode der klasse Butterfly, genau wie dotime(), ist das dann so schon korrekt ?
     
  5. #4 bytepool, 18.02.2010
    Zuletzt bearbeitet: 18.02.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,
    Dann kann das natuerlich nicht funktionieren, was du mit timeit ausfuehren willst muss schon funktionierender Code sein... Wenn draw eine Methode einer Klasse ist, wirst du draw() so direkt ja auch nicht ausfuehren koennen, nicht wahr?

    Kleines Beispiel:
    Code:
    >>> import timeit
    >>> class Foo(object):
    ...       def foo(self): print "a",
    ...
    >>> t = timeit.Timer("Foo().foo()", "from __main__ import Foo")
    >>> t.timeit(1)
    a
    2.193450927734375e-05
    
    Edit:
    Die imports muessen natuerlich auch stimmen, d.h. wenn du nicht direkt im Interpreter arbeitest, wirst du hoechstwahrscheinlich nicht von __main__ importieren...

    mfg,
    bytepool
     
  6. #5 Nemesis, 18.02.2010
    Zuletzt bearbeitet: 18.02.2010
    Nemesis

    Nemesis N3RD

    Dabei seit:
    28.01.2005
    Beiträge:
    2.165
    Zustimmungen:
    0
    also gibts keine möglichkeit die zeit zu messen die eine methode benötigt und diese dann einer variablen zu übergeben um sie weiter zu verwenden ?
     
  7. #6 bytepool, 18.02.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Ehm, ich hab doch extra ein Beispiel ausgetippt, was ist daran nicht verstaendlich?

    Edit:
    Vielleicht wird es noch deutlicher, wenn es so geschrieben steht?
    Code:
    t = timeit.Timer("foo = Foo(); foo.foo()", "from __main__ import Foo")
    
     
  8. #7 Nemesis, 18.02.2010
    Nemesis

    Nemesis N3RD

    Dabei seit:
    28.01.2005
    Beiträge:
    2.165
    Zustimmungen:
    0
    naja, so hab ichs gemacht, aber jetzt öffnet er mir jedesmal das fenster neu, wenn ich die methode ausführe.
    Code:
         def dotime(self):
              t = timeit.Timer("Butterfly().draw()","from __main__ import Butterfly")
              time = t.timeit()
              print "took %fs\n" % (time,)
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 bytepool, 18.02.2010
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Ich weiss nicht was du genau erreichen willst, aber das klingt doch so weit logisch. Wenn du einfach irgendwo im Code kurz eine Zeitmessung machen willst, wieso schreibst du das nicht einfach auf die schnelle?
    Code:
    import time
    t1 = time.time()
    Foo().foo()
    t2 = time.time()
    diff = t2 - t1
    
    Im Interpreter macht das keinen Sinn da die Zeitmessung dann davon abhaengig ist wie schnell du tippst, aber in nem Modul funktioniert das prima. Und wenn du das haeufiger fuer Funktionen brauchst, kannst du dir da auch noch ne eigene Funktion zu schreiben, z.B.
    Code:
    def measure(callable):
    ...     t1 = time.time()
    ...     callable()
    ...     t2 = time.time()
    ...     print "Time it took to call", callable, ": ", t2 - t1
    ...
    >>> measure(Foo().foo)
    
    mfg,
    bytepool
     
  11. #9 Nemesis, 18.02.2010
    Zuletzt bearbeitet: 18.02.2010
    Nemesis

    Nemesis N3RD

    Dabei seit:
    28.01.2005
    Beiträge:
    2.165
    Zustimmungen:
    0
    hm, ok, das is auch nen methode ... danke ! :)

    edit:
    warum variiert eigentlich die zeit, die er für die berechnungen benötigt so umfangreich ? müsste er nicht immer die selbe zeit für die berechnungen benötigen ?
     
Thema: [Python] Zeitmessung mit timeit
Besucher kamen mit folgenden Suchen
  1. python zeit messen

    ,
  2. python zeitmessung

    ,
  3. python zeitspanne messen

    ,
  4. phyton ms messen,
  5. python zeit für function messen,
  6. python performance messen,
  7. python clock () ausführungszeiten messen,
  8. python 3 zeit messen,
  9. python zeitmessung beispiel
Die Seite wird geladen...

[Python] Zeitmessung mit timeit - Ähnliche Themen

  1. [Python]Funktionsaufruf übergibt unbekannten Parameter

    [Python]Funktionsaufruf übergibt unbekannten Parameter: Hi, ich möchte eine Funktion der selben Klasse aufrufen und dabei Werte als Parameter übergeben, also self.<Funktionsname>(Parm1, ..., ParmN)...
  2. [Python]GUI basteln

    [Python]GUI basteln: Hi, ich möchte für ein Python-Programm eine grafische Oberfläche zur Eingabe erstellen, als IDE nutze ich Anjuta. Gibts da auch ne andere...
  3. [Python] Programm hängt

    [Python] Programm hängt: Hi, mein Programm hängt sich auf, wenn ich es laufen lasse, es lässt sich weder beenden, noch sonst etwas mit sich anstellen. durch...
  4. [Python] object is not callable

    [Python] object is not callable: Hi, ich möchte in Phyton ein Fenster erzeugen, auf dem ich dann berechnette Daten anzeigen lassen möchte. jetzt krieg ich aber ner...
  5. [python] Einträge in Listen subtrahieren

    [python] Einträge in Listen subtrahieren: Hallo, ich will eine recht einfache Formel in Python umsetzen: delta T = t_(n+1) - t_(n) (Es soll die Differenz zwischen n+1-ten und n-ten Wert...