2010-03-06 61 views
30

He estado tratando de encontrar la manera de obtener el tiempo desde 1970-01-01 00:00:00 UTC en segundos y nanosegundos en python y no encuentro nada que me brinde la precisión adecuada.Obtenga tiempo POSIX/Unix en segundos y nanosegundos en Python?

He intentado usar módulo de tiempo, pero que la precisión es sólo para microsegundos, por lo que el código que probé fue:

import time 

print time.time() 

que me dio un resultado como este:

1267918039.01 

Sin embargo, Necesito un resultado que se parece a esto:

1267918039.331291406 

¿Alguien sabe una forma posible de expresar UNIX tim e en segundos y nanosegundos? No puedo encontrar una manera de establecer la precisión adecuada u obtener un resultado en el formato correcto. Gracias por cualquier ayuda

+0

@GregS: persistencia viene con la edad :) – tzot

Respuesta

5

Es poco probable que obtenga precisión de nanosegundos desde cualquier máquina actual.

La máquina no puede crear precisión, y mostrar dígitos significativos donde no es apropiado no es Lo correcto.

2

No creo que haya una manera independiente de la plataforma (tal vez un tercero haya codificado una, pero no puedo encontrarla) para obtener tiempo en nanosegundos; tienes que hacerlo de una manera específica de la plataforma. Por ejemplo, la respuesta de this SO question muestra cómo hacerlo en la plataforma que suministra una biblioteca de sistema librt.so para operaciones en "tiempo real".

31

Su precisión simplemente se pierde debido al formato de cadena:

>>> import time 
>>> print "%.20f" % time.time() 
1267919090.35663390159606933594 
+4

En realidad me puedo imaginar que tiene una precisión de tantos lugares decimales, pero no es de precisión ! :) – MattH

+2

quiere decir que es * no * exacto a tantos lugares decimales. ['time.time()' en CPython reciente usa el 'clock_gettime (2)', 'GetSystemTimeAsFileTime()' depening en el sistema operativo (también puede llamarlos en versiones anteriores de Python) (http://stackoverflow.com/a/ 28574340/4279)), aunque probablemente el tiempo del sistema no sea lo suficientemente preciso incluso para interfaces antiguas basadas en microsegundos. – jfs

+1

Es imposible obtener precisión de nanosegundos desde 1970-04-15 desde time.time no importa qué formato esté utilizando, porque time.time devuelve float y solo tiene 53 bits de precisión significativa que solo puede representar aproximadamente 104 días en precisión de nanosegundos (9007199254740992 nanosegundos). – czz

8

El problema está probablemente relacionado con su sistema operativo, no Python. Consulte la documentación del módulo time: http://docs.python.org/library/time.html

time.time()

Volver el tiempo como un número de coma flotante expresado en segundos desde la época , en UTC. Tenga en cuenta que aunque el tiempo siempre se devuelve como número de coma flotante, no todos los sistemas proporcionan tiempo con una mejor precisión que 1 segundo. Mientras que esta función normalmente devuelve valores no decrecientes, puede devolver un valor más bajo que una llamada anterior si el reloj del sistema se ha reestablecido entre las dos llamadas.

En otras palabras: si su sistema operativo no puede hacerlo, Python no puede hacerlo. Puede multiplicar el valor de retorno por el orden de magnitud apropiado para obtener el valor de nanosegundo, aunque impreciso.

EDITAR: El retorno es una variable flotante, por lo que el número de dígitos después de la coma variará, si su sistema operativo tiene ese nivel de precisión o no. Puede formatearlo con "%.nf" donde n es el número de dígitos que desea, si desea una representación de cadena de puntos fija.

+1

Creo que el problema no puede ser ni con el sistema operativo ni con python ... el problema es que debería haber una manera de obtener metadatos sobre cuál es la mayor precisión de tiempo actualmente soportada y una manera de obtener tiempo en eso, y que no lo saben. :) – n611x007

3

Depende del tipo de reloj y su sistema operativo y el hardware, ya sea que se pueda obtener una precisión de nanosegundos de en total. Del time module documentation:

La precisión de las diversas funciones en tiempo real puede ser menor que la sugerida por las unidades en las que se expresa su valor o argumento. P.ej. en la mayoría de los sistemas Unix, el reloj "marca" solo 50 o 100 veces por segundo.

En Python 3, el módulo time le da acceso a 5 tipos diferentes de reloj, cada uno con propiedades diferentes; algunos de estos pueden ofrecen sincronización de precisión de nanosegundos. . Utilice la time.get_clock_info() function para ver cuáles son las características que ofrece cada reloj y qué tiempo de la precisión se informa en

En mi OS X 10.11 ordenador portátil, las funciones disponibles son:

>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'): 
...  print(name, time.get_clock_info(name), sep=': ') 
... 
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06) 
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09) 
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09) 
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06) 
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06) 

así que usar las time.monotonic() o time.perf_counter() funciones teóricamente dame una resolución de nanosegundos. Ninguno de los dos relojes me da tiempo de pared, solo el tiempo transcurrido; los valores son por lo demás arbitrarios. Sin embargo, son útiles para medir cuánto tiempo tomó algo.

Cuestiones relacionadas