program - time.clock python
¿Cómo obtengo duraciones de tiempo monótonas en Python? (5)
Ahora, en Python 3.3 usaría time.monotonic .
Quiero registrar cuánto tiempo lleva algo en el verdadero tiempo en la pared. Actualmente estoy haciendo esto:
startTime = time.time()
someSQLOrSomething()
print "That took %.3f seconds" % (time.time() - startTime)
Pero eso fallará (producirá resultados incorrectos) si se ajusta el tiempo mientras se está ejecutando la consulta SQL (o lo que sea).
No quiero simplemente compararlo. Quiero iniciar sesión 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 ().
Así es como obtengo 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.
Como se señala en esta pregunta , evitar los reajustes de NTP en Linux requiere CLOCK_MONOTONIC_RAW. Eso se define como 4 en Linux (desde 2.6.28).
Portables obtener la constante # correcta definida en un encabezado C de Python es complicado; hay h2py, pero eso realmente no ayuda a obtener el valor en tiempo de ejecución.
Esa función es lo suficientemente simple como para usar ctypes para acceder a ella:
#!/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()
time.monotonic()
puede ser útil:
Devuelve el valor (en segundos fraccionarios) 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.