1766 Stimmen

Wie ermittle ich den Zeitpunkt der Ausführung eines Python-Programms?

Ich habe ein Kommandozeilenprogramm in Python, das eine Weile braucht, bis es fertig ist. Ich möchte die genaue Zeit wissen, die es braucht, um die Ausführung zu beenden.

Ich habe mir die timeit Modul, aber es scheint nur für kleine Codeschnipsel geeignet zu sein. Ich möchte die Zeit für das gesamte Programm messen.

3014voto

rogeriopvl Punkte 46915

Der einfachste Weg in Python:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))

Dabei wird davon ausgegangen, dass Ihr Programm mindestens eine Zehntelsekunde zur Ausführung benötigt.

Drucke:

--- 0.764891862869 seconds ---

116 Stimmen

Dabei wird allerdings die tatsächliche Zeit berechnet (einschließlich der von anderen Programmen verbrauchten Zeit), so dass es länger dauert, wenn Ihr Computer mit anderen Dingen beschäftigt ist.

67 Stimmen

Unter Windows machen Sie dasselbe, aber verwenden Sie time.clock() anstelle von time.time(). Sie erhalten eine etwas bessere Genauigkeit.

71 Stimmen

Ich empfehle Folgendes round(time.time() - start_time, 2) (oder welche Dezimalzahl Sie auch immer wollen), erhielt ich wissenschaftliche Zahlen wie 1,24e-5 zurück.

294voto

steveha Punkte 70950

Unter Linux oder Unix:

$ time python yourprogram.py

Unter Windows, siehe diese StackOverflow-Frage: Wie kann ich die Ausführungszeit eines Befehls in der Windows-Befehlszeile messen?

Für eine ausführlichere Ausgabe,

$ time -v python yourprogram.py
    Command being timed: "python3 yourprogram.py"
    User time (seconds): 0.08
    System time (seconds): 0.02
    Percent of CPU this job got: 98%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 9480
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 1114
    Voluntary context switches: 0
    Involuntary context switches: 22
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

0 Stimmen

So, wenn ich ein anderes Widget, Beispiel in QT-Anwendung starten, wie berechnen wir die Zeit von diesem Widget genommen zu zeigen?

0 Stimmen

Aber das scheint die Zeit nicht in Minuten und Sekunden anzugeben, sondern endet als fließende Zahl!

3 Stimmen

Ja, es wird eine Anzahl von Sekunden angegeben. Sie können in min:Sekunden umrechnen, wenn Sie möchten. Sehen Sie sich die Antwort von Paul McGuire und seine secondsToStr() Funktion.

261voto

PaulMcG Punkte 59178

Ich habe das timing.py Modul in mein eigenes site-packages Verzeichnis, und fügen Sie einfach import timing am Anfang meines Moduls:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")

Ich kann auch anrufen timing.log aus meinem Programm heraus, wenn es wichtige Etappen innerhalb des Programms gibt, die ich zeigen möchte. Aber einfach einschließen import timing druckt die Start- und Endzeit sowie die insgesamt verstrichene Zeit. (Verzeihen Sie meine unklare secondsToStr Funktion wird lediglich eine Fließkommazahl von Sekunden in der Form hh:mm:ss.sss formatiert).

Hinweis: Eine Python 3-Version des obigen Codes finden Sie unter aquí o aquí .

11 Stimmen

Dies ist eine wirklich saubere Lösung, die auch funktioniert, wenn Sie Strg-C drücken, um das Programm zu beenden.

0 Stimmen

Großartige Lösung, ich werde sie auf jeden Fall verwenden und einen Timing-Dekorator erstellen, um Engpassfunktionen zu identifizieren

14 Stimmen

Für Python 3 hinzufügen from functools import reduce am Anfang und setzen Sie Klammern um jede Druckanweisung. Funktioniert prima!

159voto

metakermit Punkte 19096

Mir gefällt die Ausgabe der datetime Modul, in dem Zeitdelta-Objekte je nach Bedarf Tage, Stunden, Minuten usw. in einer für Menschen lesbaren Form anzeigen.

Zum Beispiel:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Beispielhafte Ausgabe z.B.

Duration: 0:00:08.309267

o

Duration: 1 day, 1:51:24.269711

Wie J.F. Sebastian erwähnte, kann dieser Ansatz in einigen Fällen mit der Ortszeit Probleme bereiten und ist daher sicherer:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))

2 Stimmen

@phansen: Sie könnten verwenden timedelta(seconds=time.monotonic()-start) hier (oder time.time() wenn das Intervall groß ist). Ziehen Sie keine naiven datetime-Objekte ab, die die Ortszeit darstellen; die Ortszeit ist nicht monoton

0 Stimmen

OK, Sie meinen wie start_time = time.monotonic(); end_time = time.monotonic(); timedelta(seconds=end_time - start_time) . Ich vertraue darauf, dass du Recht hast, aber dann musst du es auch formatieren, wenn du zurückkommst. datetime.timedelta(0, 0, 76) . Außerdem scheint die monotone Methode erst in Python 3 hinzugefügt worden zu sein.

0 Stimmen

Ah, okay. Ich sehe, Sie können es an str() um es "menschlich" zu machen. Ich werde die Antwort aktualisieren, danke.

127voto

newacct Punkte 114757
import time

start_time = time.clock()
main()
print(time.clock() - start_time, "seconds")

time.clock() gibt die Prozessorzeit zurück, so dass wir nur die von diesem Prozess verbrauchte Zeit berechnen können (jedenfalls unter Unix). In der Dokumentation heißt es: "In jedem Fall ist dies die Funktion, die für das Benchmarking von Python- oder Timing-Algorithmen zu verwenden ist".

19 Stimmen

Time.time() wird am besten unter *nix verwendet. time.clock() wird am besten unter Windows verwendet.

0 Stimmen

Ich glaube, dies kann nicht verwendet werden, um "nur die von diesem Prozess verbrauchte Zeit" zu berechnen, da es die Systemzeit verwendet und von anderen Systemprozessen beeinflusst wird? Korrigieren Sie mich, wenn ich falsch liege :)

26 Stimmen

Hinweis: time.clock() ist "Veraltet seit Version 3.3: Das Verhalten dieser Funktion hängt von der Plattform ab: Verwenden Sie stattdessen perf_counter() [mit geschlafener Zeit] oder process_time() [ohne geschlafene Zeit], je nach Ihren Anforderungen, um ein gut definiertes Verhalten zu haben."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X