it-swarm-eu.dev

Pythons Genauigkeit time.clock () vs. time.time ()?

Was ist besser für das Timing in Python zu verwenden? time.clock () oder time.time ()? Welches liefert mehr Genauigkeit?

zum Beispiel:

start = time.clock()
... do something
elapsed = (time.clock() - start)

vs.

start = time.time()
... do something
elapsed = (time.time() - start)
414
Corey Goldberg

Ab 3.3 ist time.clock () veraltet , und es wird empfohlen, time zu verwenden .process_time () oder time.perf_counter () stattdessen.

Zuvor in 2.7 laut Zeitmodul docs:

time.clock ()

Unter Unix geben Sie die aktuelle Prozessorzeit als Gleitkommazahl in Sekunden zurück. Die Genauigkeit und tatsächlich die genaue Definition der Bedeutung von "Prozessorzeit" hängt von der der gleichnamigen C-Funktion ab, aber in jedem Fall ist dies die zu verwendende Funktion zum Benchmarking von Python oder Timing-Algorithmen

Unter Windows gibt diese Funktion die seit dem ersten Aufruf dieser Funktion verstrichenen Wanduhrsekunden als Gleitkommazahl zurück, basierend auf der Win32-Funktion QueryPerformanceCounter (). Die Auflösung ist normalerweise besser als eine Mikrosekunde.

Zusätzlich gibt es das timeit Modul zum Benchmarking von Code-Snippets.

151
Jason Navarrete

Die kurze Antwort lautet: Die meiste Zeit wird time.clock() besser sein. Wenn Sie jedoch Hardware zeitlich festlegen (z. B. einen in die GPU eingegebenen Algorithmus), wird diese Zeit durch time.clock() beseitigt, und time.time() ist die einzige verbleibende Lösung.

Hinweis: Unabhängig von der verwendeten Methode hängt das Timing von Faktoren ab, die Sie nicht steuern können (wann wechselt der Prozess, wie oft, ...). Dies ist bei time.time() schlimmer, existiert jedoch auch bei time.clock(). Sie sollten also niemals nur einen Zeitmessungstest durchführen, sondern immer eine Reihe von Tests durchführen und den Mittelwert/die Varianz der Zeiten betrachten.

45
PierreBdR

Andere haben geantwortet: time.time() vs. time.clock().

Wenn Sie jedoch die Ausführung eines Codeblocks für Benchmarking-/Profiling-Zwecke planen, sollten Sie sich das timeit -Modul ansehen.

25
dF.

Beachten Sie Folgendes: Das Ändern der Systemzeit wirkt sich auf time.time(), jedoch nicht auf time.clock() aus.

Ich musste einige automatische Testausführungen kontrollieren. Wenn ein Schritt des Testfalls mehr als eine bestimmte Zeit in Anspruch nahm, wurde dieser TC abgebrochen, um mit dem nächsten fortzufahren.

Manchmal war jedoch ein Schritt erforderlich, um die Systemzeit zu ändern (um das Scheduler-Modul der zu testenden Anwendung zu überprüfen). Nach dem Festlegen der Systemzeit für einige Stunden in der Zukunft lief das TC-Timeout ab und der Testfall wurde abgebrochen. Ich musste von time.time() auf time.clock() umschalten, um das richtig zu handhaben.

19
Seba

clock() -> Gleitkommazahl

Gibt die CPU-Zeit oder Echtzeit seit dem Start des Prozesses oder seit dem ersten Aufruf von clock() zurück. Dies ist genauso präzise wie die Systemaufzeichnung.

time() -> Gleitkommazahl

Gibt die aktuelle Zeit in Sekunden seit der Epoche zurück. Sekundenbruchteile können vorhanden sein, wenn die Systemuhr sie bereitstellt.

Normalerweise ist time() genauer, da Betriebssysteme die Prozesslaufzeit nicht mit der Genauigkeit speichern, mit der sie die Systemzeit (dh die tatsächliche Zeit) speichern.

18
Vinko Vrsalovic

Kommt darauf an, was dir wichtig ist. Wenn Sie WALL TIME (wie in, die Zeit auf der Uhr an Ihrer Wand) meinen, liefert time.clock () KEINE Genauigkeit, da es die CPU-Zeit verwalten kann.

17
user15910

Für mich hat practice. time() eine bessere Präzision als clock() unter Linux. clock() hat nur eine Genauigkeit von weniger als 10 ms. Während time() Präfekt Präzision gibt. Mein Test läuft unter CentOS 6.4 , python 2.6

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms
14
bestwolf1983

Der Unterschied ist sehr plattformspezifisch.

clock () unterscheidet sich unter Windows stark von Linux.

Für die Art von Beispielen, die Sie beschreiben, möchten Sie wahrscheinlich stattdessen das "timeit" -Modul.

6
Justin Sheehy

Unter Unix misst time.clock () die CPU-Zeit, die vom aktuellen Prozess verbraucht wurde. Daher ist es nicht gut, die verstrichene Zeit von einem Zeitpunkt in der Vergangenheit an zu messen. Unter Windows werden die Sekunden der Wanduhr gemessen, die seit dem ersten Aufruf der Funktion vergangen sind. Bei beiden Systemen gibt time.time () die seit der Epoche verstrichenen Sekunden zurück.

Wenn Sie Code schreiben, der nur für Windows gedacht ist, funktioniert beides (obwohl Sie die beiden unterschiedlich verwenden - für time.clock () ist keine Subtraktion erforderlich). Wenn dies auf einem Unix-System ausgeführt werden soll oder der Code garantiert portabel sein soll, sollten Sie time.time () verwenden.

3
auspace

Wie andere angemerkt haben, wird time.clock() zugunsten von time.perf_counter() oder time.process_time() abgelehnt, aber Python 3.7 führt das Auflösungs-Timing für Nanosekunden mit time.perf_counter_ns() , time.process_time_ns() = ein und time.time_ns() , zusammen mit 3 anderen Funktionen.

Diese 6 neuen Nanosekundenauflösungsfunktionen werden in PEP 564 detailliert beschrieben:

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

Diese Funktionen ähneln der Version ohne das Suffix _ns, geben jedoch eine Anzahl von Nanosekunden als Python int zurück.

Wie auch andere angemerkt haben, verwenden Sie das Modul timeit , um Funktionen und kleine Code-Schnipsel zeitlich zu bestimmen.

3
Chris_Rands

Kurze Antwort: Verwenden Sie time.clock () für das Timing in Python.

Auf * nix-Systemen gibt clock () die Prozessorzeit als Gleitkommazahl in Sekunden zurück. Unter Windows werden die seit dem ersten Aufruf dieser Funktion verstrichenen Sekunden als Gleitkommazahl zurückgegeben.

time () gibt die Sekunden seit der Epoche in UTC als Gleitkommazahl zurück. Es gibt keine Garantie, dass Sie eine bessere Genauigkeit von 1 Sekunde erhalten (obwohl time () eine Gleitkommazahl zurückgibt). Beachten Sie außerdem, dass der zweite Funktionsaufruf einen niedrigeren Wert zurückgibt, wenn die Systemuhr zwischen zwei Aufrufen dieser Funktion zurückgesetzt wurde.

2
Babak

Ich benutze diesen Code, um 2 Methoden zu vergleichen. Mein Betriebssystem ist Windows 8, Prozessorkern i5, RAM 4GB

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

ausgabe:

zeit () = 0,0993799996376

clock () = 0.0993572257367

2

Nach meinem besten Verständnis ist time.clock () so genau, wie es Ihr System zulässt.

2
Jake

Richtige Antwort: Sie sind beide gleich lang wie ein Bruch.

Aber was ist schneller, wenn subjecttime ist?

Ein kleiner Testfall:

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

Ich arbeite nicht in einem Schweizer Labor, aber ich habe getestet ..

Basierend auf dieser Frage: time.clock() ist besser als time.time()

Bearbeiten: time.clock() ist ein interner Zähler, kann also nicht außerhalb verwendet werden, hat Einschränkungen max 32BIT FLOAT, kann nicht weiter gezählt werden, wenn der erste/letzte Wert nicht gespeichert wird. Ein weiterer Zähler kann nicht zusammengeführt werden ...

1
dsgdfg