He estado construyendo una aplicación de registro de errores recientemente y estaba buscando una manera de marcar el tiempo con precisión los datos entrantes. Cuando digo con precisión me refiero a que cada marca de tiempo debe ser precisa en relación con la otra (no es necesario sincronizarla con un reloj atómico ni nada de eso).Marca de tiempo precisa en el registro de Python
He estado usando datetime.now() como un primer intento, pero esto no es perfecta:
>>> for i in range(0,1000):
... datetime.datetime.now()
...
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 562000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 578000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 609000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 609000)
datetime.datetime(2008, 10, 1, 13, 17, 27, 609000)
etc.
Los cambios entre los relojes para el primer segundo de muestras se ve así:
uSecs difference
562000
578000 16000
609000 31000
625000 16000
640000 15000
656000 16000
687000 31000
703000 16000
718000 15000
750000 32000
765000 15000
781000 16000
796000 15000
828000 32000
843000 15000
859000 16000
890000 31000
906000 16000
921000 15000
937000 16000
968000 31000
984000 16000
Parece que los datos del temporizador solo se actualizan cada ~ 15-32ms en mi máquina. El problema surge cuando analizamos los datos porque ordenar por fecha distinta de la marca de tiempo y luego ordenar por marca de tiempo nuevamente puede dejar los datos en el orden incorrecto (cronológicamente). Sería bueno tener las marcas de tiempo precisas hasta el punto de que cualquier llamada al generador de marca de tiempo proporcione una marca de tiempo única.
He estado considerando algunos métodos que implican el uso de una llamada time.clock() agregada a una fecha de inicio, pero agradecería una solución que funcione con precisión a través de subprocesos en la misma máquina. Cualquier sugerencia sería muy gratamente recibida.
Acabo de publicar una nueva respuesta, en * Windows * al menos, usando Python, puedes obtener marcas de tiempo de sub-microsegundo * * (NO precisión) usando el reloj Windows QPC, como demuestro en el código vinculado en mi responder. –
¿Por qué demonios estás construyendo tu propio marco de trabajo? Ya hay muchos y las marcas de tiempo son un problema resuelto (hasta cierto nivel de precisión). En el caso improbable de que tenga un caso de uso que no resuelva un marco de trabajo existente, ¿puede elegir el más cercano y plantear un problema y enviar su código al mismo? – smci
Porque hace ~ 8.5 años (cuando publiqué esto) las opciones eran algo más limitadas. No estaba construyendo un marco de registro de errores, estaba escribiendo algo para recibir datos UDP e información de registro de eso. Si hubiera una biblioteca disponible (y que hubiera encontrado) que hubiera hecho eso habría estado completamente abierta para usarla ;-) –