Wie kann ich monotones Zeitdauern in Python bekommen?
-
05-07-2019 - |
Frage
Ich möchte einzuloggen, wie lange etwas in Echtwalltime nimmt. Derzeit wird diese ich tue:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Aber das wird nicht (falsche Ergebnisse erzeugen), wenn die Zeit eingestellt wird, während die SQL-Abfrage (oder was auch immer es ist) ausgeführt wird.
Ich will nicht nur Benchmark es. Ich möchte es in einer Live-Anwendung, um protokollieren Trends auf einem Live-System zu sehen.
Ich möchte so etwas wie clock_gettime (CLOCK_MONOTONIC, ...), aber in Python. Und vorzugsweise ohne eine C-Modul zu schreiben, die clock_gettime () aufruft.
Lösung
Diese Funktion ist einfach genug, dass man ctypes kann darauf zugreifen:
#!/usr/bin/env python
__all__ = ["monotonic_time"]
import ctypes, os
CLOCK_MONOTONIC_RAW = 4 # see <linux/time.h>
class timespec(ctypes.Structure):
_fields_ = [
('tv_sec', ctypes.c_long),
('tv_nsec', ctypes.c_long)
]
librt = ctypes.CDLL('librt.so.1', use_errno=True)
clock_gettime = librt.clock_gettime
clock_gettime.argtypes = [ctypes.c_int, ctypes.POINTER(timespec)]
def monotonic_time():
t = timespec()
if clock_gettime(CLOCK_MONOTONIC_RAW , ctypes.pointer(t)) != 0:
errno_ = ctypes.get_errno()
raise OSError(errno_, os.strerror(errno_))
return t.tv_sec + t.tv_nsec * 1e-9
if __name__ == "__main__":
print monotonic_time()
Andere Tipps
Nun, in Python 3.3 würden Sie time.monotonic .
Wie in diese Frage , Vermeidung von NTP Nachjustierungen auf Linux erfordert CLOCK_MONOTONIC_RAW. Das ist definiert als 4 auf Linux (seit 2.6.28).
portably die richtige Konstante in einem C-Header von Python #defined bekommen ist schwierig; gibt es h2py, aber das ist nicht wirklich helfen, den Wert zur Laufzeit zu bekommen.
Hier ist, wie ich monotone Zeit in Python 2.7 bekommen:
Installieren Sie das monotonic
Paket:
pip install monotonic
Dann in Python:
import monotonic; mtime = monotonic.time.time #now mtime() can be used in place of time.time()
t0 = mtime()
#...do something
elapsed = mtime()-t0 #gives correct elapsed time, even if system clock changed.
time.monotonic()
könnte nützlich sein:
Gibt den Wert (in Sekundenbruchteilen) eines monotonen Takt, das heißt eine Uhr, die nicht rückwärts gehen kann. Die Uhr wird nicht durch Systemtakt Updates betroffen. Der Referenzpunkt der zurückgegebene Wert nicht definiert ist, so dass nur die Differenz zwischen den Ergebnissen aufeinander folgender Anrufe gültig ist.