Pregunta

Quiero registrar cuánto tiempo lleva 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 la consulta SQL (o lo que sea) se está ejecutando.

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 ().

¿Fue útil?

Solución

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 <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()

Otros consejos

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

Como se señala en esta pregunta , evitando el NTP los reajustes en Linux requieren CLOCK_MONOTONIC_RAW. Eso se define como 4 en Linux (desde 2.6.28).

Es astuto 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:

Instale el paquete monotónico :

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 () puede 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top