2013-03-02 7 views
6

Ich würde gerne einen Ausschnitt meines Codes Zeit, und ich möchte nur die CPU-Ausführungszeit (Betriebssystemprozesse ignorieren usw.).Timing der CPU-Zeit eines Python-Programms?

Ich habe versucht, time.clock(), es erscheint zu ungenau, und gibt jedes Mal eine andere Antwort. (In der Theorie sicherlich, wenn ich es wieder für den gleichen Code-Snippet ausführen würde es den gleichen Wert zurückgeben ??)

Ich habe mit Timeit für etwa eine Stunde gespielt. Im Grunde ist es für mich der "Setup" -Prozess, ich muss ungefähr 20 Funktionen importieren, was unpraktisch ist, da ich meinen Code praktisch nur in den Setup-Abschnitt schreibe, um ihn zu benutzen.

Cprofile sehen immer attraktiver aus, aber geben sie CPU-Zeit zurück? auch ein kleiner Punkt - es gibt viel zu viele Informationen aus. Gibt es eine Möglichkeit, die ausgegebenen Informationen in eine TXT- oder .DAT-Datei zu bekommen, damit ich sie tatsächlich lesen kann?

Prost

OS: Ubuntu Programm: Python 2.7

+2

Beachten Sie, dass Sie für jeden Lauf unterschiedliche Zeiten erhalten, auch wenn Sie nur von Ihrem Prozess gegessene CPU-Zyklen zählen möchten. Dies liegt am CPU-Cache, der jedes Mal in einem anderen Zustand (mit verschiedenen Teilen des Adressraums) endet. Der CPU-Cache wird von Prozessen gemeinsam genutzt. Sie können also nicht garantieren, dass beispielsweise bei jeder Ausführung des Codes eine bestimmte Variable im Cache verbleibt. – liori

+0

[resource.getrusage] (http://docs.python.org/2/library/resource.html) kann verwendet werden, um Prozesszeit in Python 2.7 zu bekommen. – Annan

Antwort

7

Es klingt wie Sie sind für eine Art und Weise zu Zeit die prozessweiten Ausführungszeit suchen, ist das Beste, was man ist timeit.default_timer() verwenden tun können, die bietet die genaueste Funktion time.clock() oder time.time(), die auf der aktuellen Plattform verfügbar ist, aber es ist systemweit Zeit, was bedeutet, dass andere Prozesse Ihre Messungen beeinträchtigen können.

Hier ist die Info von der Dokumentation von timeit.default_timer():

definiert einen Standard-Timer, in einem plattformspezifischen Weise. Unter Windows hat time.clock() eine Mikrosekunden-Granularität, aber die -Datei von time.time() ist 1/60 Sekunde. Unter Unix hat time.clock() 1/100. einer zweiten Granularität, und time.time() ist viel genauer. On entweder Plattform, default_timer() misst Wanduhrzeit, nicht die CPU Zeit. Dies bedeutet, dass andere Prozesse, die auf demselben Computer ausgeführt werden, das Timing beeinträchtigen können.

Sie sollten versuchen, C-Module zu testen, die möglicherweise Zugriff auf verschiedene Timing-Apis haben.


Die beste Art und Weise dies durch den Einsatz time.process_time(), die nur in Python verfügbar ist, zu tun ist 3.3 und bis, hier ist die Info aus der Dokumentation:

Rückkehr der Wert (in Sekundenbruchteilen) der Summe des Systems und Benutzer CPU-Zeit des aktuellen Prozesses. Die verstrichene Zeit während des Schlafs wird nicht berücksichtigt. Es ist prozessweit per Definition. Der Referenzpunkt von der zurückgegebene Wert ist nicht definiert, so dass nur die Differenz zwischen die Ergebnisse von aufeinander folgenden Aufrufen gültig ist.

+4

Gute Antwort, aber 'process_time' ist nur in Python 3.3 und später benutzt er 2,7. – omz

+0

Verdammt, du hast recht – Shedokan

+3

'timeit.default_timer()' ist 'time.perf_counter()' auf Python 3.3+. Hier sind ['time.process_time()' und 'time.perf_counter()' für Python 2 auf Ubuntu.] (Https://gist.github.com/zed/5073409) – jfs

3

Verwenden Sie statt time.clock()timeit.default_timer(); Es verwendet die genaueste Option für Ihre Plattform.Für Ubuntu zum Beispiel wird dies stattdessen time.time() verwenden. Wenn Sie timeit verwenden, erstellen Sie eine Setup-Funktion, die Sie dann wieder für timeit verwenden können. Ja, das sieht nach ein bisschen Arbeit aus, aber es stellt sicher, dass Sie Zeit haben, was Sie wirklich messen wollten, und keinen Setup-Code in den zeitkritischen Messbereich einbeziehen.