¿Cómo obtengo duraciones monotónicas en python?

Quiero registrar cuánto tiempo tarda algo en tiempo real de pared. Actualmente estoy haciendo esto:

startTime = time.time() someSQLOrSomething() print "That took %.3f seconds" % (time.time() - startTime) 

Pero eso fallará (producirá resultados incorrectos) si el tiempo se ajusta mientras se ejecuta la consulta SQL (o lo que sea).

No quiero solo compararlo. Quiero registrarlo en una aplicación en vivo para ver las tendencias en un sistema en vivo.

Quiero algo como clock_gettime (CLOCK_MONOTONIC, …), pero en Python. Y preferiblemente sin tener que escribir un módulo C que llame a clock_gettime ().

Related of "¿Cómo obtengo duraciones monotónicas en python?"

Esa función es lo suficientemente simple como para que puedas usar ctypes para acceder a ella:

 #!/usr/bin/env python __all__ = ["monotonic_time"] import ctypes, os CLOCK_MONOTONIC_RAW = 4 # see  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() 

Ahora, en Python 3.3 usarías time.monotonic .

Como se señaló en esta pregunta , evitar los reajustes NTP en Linux requiere CLOCK_MONOTONIC_RAW. Eso se define como 4 en Linux (desde 2.6.28).

Lograr obtener la constante correcta # definida en un encabezado C desde Python es complicado; existe h2py, pero eso no ayuda realmente a obtener el valor en tiempo de ejecución.

Así es como obtengo el tiempo monotónico en Python 2.7:

Instala el paquete monotonic :

 pip install monotonic 

Luego en 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() podría ser útil:

Devuelve el valor (en fracciones de segundos) de un reloj monotónico, es decir, un reloj que no puede retroceder. El reloj no se ve afectado por las actualizaciones del reloj del sistema. El punto de referencia del valor devuelto no está definido, por lo que solo la diferencia entre los resultados de llamadas consecutivas es válida.