Ich möchte eine Python-Funktion erstellen, um die in jeder Funktion verbrachte Zeit zu testen und ihren Namen mit ihrer Zeit zu drucken, wie ich den Funktionsnamen drucken kann und ob es eine andere Möglichkeit gibt, dies zu sagen
def measureTime(a):
start = time.clock()
a()
elapsed = time.clock()
elapsed = elapsed - start
print "Time spent in (function name) is: ", elapsed
timeit
für die Messung verwenden. Es ist nicht perfekt, aber es schlägt Ihren Stich bei weitem und es ist viel einfacher zu bedienen,timeit
als selbst etwas Besseres zu zaubern.Antworten:
In erster Linie empfehle ich dringend, einen Profiler zu verwenden oder zumindest timeit zu verwenden .
Wenn Sie jedoch Ihre eigene Timing-Methode ausschließlich zum Lernen schreiben möchten, finden Sie hier einen Einstieg in die Verwendung eines Dekorateurs.
Python 2:
Und die Verwendung ist sehr einfach, verwenden Sie einfach den @ timing-Dekorator:
Python 3:
Hinweis Ich rufe
f.func_name
auf, um den Funktionsnamen als Zeichenfolge (in Python 2) oderf.__name__
in Python 3 abzurufen.quelle
Nach dem Spielen mit dem
timeit
Modul gefällt mir die Benutzeroberfläche nicht, die im Vergleich zu den folgenden beiden Methoden nicht so elegant ist.Der folgende Code befindet sich in Python 3.
Die Dekorationsmethode
Dies ist fast das gleiche mit @ Mikes Methode. Hier füge ich hinzu
kwargs
undfunctools
wickle es ein, um es besser zu machen.Die Kontextmanager-Methode
Zum Beispiel können Sie es wie folgt verwenden:
Und der Code innerhalb des
with
Blocks wird zeitlich festgelegt.Fazit
Mit der ersten Methode können Sie den Dekorateur leicht auskommentieren, um den normalen Code zu erhalten. Es kann jedoch nur eine Funktion zeitlich festgelegt werden. Wenn Sie einen Teil des Codes haben, den Sie nicht als Funktion verwenden können, können Sie die zweite Methode auswählen.
Zum Beispiel haben Sie jetzt
Jetzt möchten Sie die
bigImage = ...
Linie zeitlich festlegen. Wenn Sie es in eine Funktion ändern, ist es:Sieht nicht so gut aus ... Was ist, wenn Sie in Python 2 sind, das kein
nonlocal
Schlüsselwort hat?Stattdessen passt die Verwendung der zweiten Methode hier sehr gut:
quelle
timeit
Schnittstelle ändern und diewraps()
Funktion desfunctools
Moduls verwenden mussten. Ich meine, all dieser zusätzliche Code ist nicht notwendig.import functools
Ich sehe nicht, wo das Problem mit dem
timeit
Modul liegt. Dies ist wahrscheinlich der einfachste Weg, dies zu tun.Es ist auch möglich, Argumente an die Funktionen zu senden. Alles, was Sie brauchen, ist, Ihre Funktion mit Dekorateuren abzuschließen. Weitere Erklärungen hier: http://www.pythoncentral.io/time-a-python-function/
Der einzige Fall, in dem Sie möglicherweise daran interessiert sind, Ihre eigenen Timing-Anweisungen zu schreiben, besteht darin, dass Sie eine Funktion nur einmal ausführen und auch ihren Rückgabewert erhalten möchten.
Der Vorteil der Verwendung des
timeit
Moduls besteht darin, dass Sie die Anzahl der Ausführungen wiederholen können . Dies kann erforderlich sein, da andere Prozesse Ihre Timing-Genauigkeit beeinträchtigen können. Sie sollten es also mehrmals ausführen und sich den niedrigsten Wert ansehen.quelle
timeit.timeit(lambda: func(a,b,c), number=1)
? Ich benutze dies, wenn ich Tests an einer hypothetischen Lösung in einem Terminal durchführe.Timeit hat zwei große Fehler: Es gibt nicht den Rückgabewert der Funktion zurück und verwendet eval, was die Übergabe von zusätzlichem Setup-Code für Importe erfordert. Dies löst beide Probleme einfach und elegant:
quelle
Es gibt ein einfaches Werkzeug für das Timing. https://github.com/RalphMao/PyTimer
Es kann wie ein Dekorateur arbeiten :
Ausgabe:
Es kann auch wie ein Plug-In-Timer mit Namespace-Steuerung funktionieren (hilfreich, wenn Sie ihn in eine Funktion einfügen, die viele Codes enthält und an einer anderen Stelle aufgerufen werden kann).
Ausgabe:
Hoffe es wird helfen
quelle
Decorator-Methode mit der Decorator-Python-Bibliothek:
Siehe Beitrag in meinem Blog:
Beitrag auf mobilepro.pl Blog
Mein Beitrag bei Google Plus
quelle
Meine Art es zu tun:
Setzen Sie eine Variable wie
start = time()
zuvor, führen Sie die Funktion / Schleifen aus undprintTime(start)
direkt nach dem Block.und du hast die Antwort.
quelle