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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top