在Python中以秒和纳秒获取POSIX / Unix时间?

时间:2010-03-06 23:30:37

标签: python time posix

我一直在努力寻找一种方法来获取自1970-01-01 00:00:00 UTC以来的时间(以秒为单位)和python中的纳秒数,我找不到能给我正确精度的任何东西。

我尝试过使用时间模块,但精度只有几微秒,所以我尝试的代码是:

import time

print time.time()

给了我这样的结果:

1267918039.01

但是,我需要一个如下所示的结果:

1267918039.331291406

有谁知道以秒和纳秒表达UNIX时间的可能方法?我找不到设置正确精度或以正确格式获得结果的方法。感谢您的帮助

6 个答案:

答案 0 :(得分:36)

由于字符串格式化,您的精确度正在丢失:

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

答案 1 :(得分:9)

问题可能与您的操作系统有关,而不是Python。请参阅time模块的文档:http://docs.python.org/library/time.html

  

time. time()

     

将时间作为浮点返回   以秒为单位表示的数字   时代,UTC请注意,即使   时间总是作为一个返回   浮点数,不是全部   系统提供了更好的时间   精度超过1秒。虽然这个   功能正常返回   非递减值,它可以返回一个   比以前的呼叫更低的值   系统时钟已经退回   这两个电话之间。

换句话说:如果你的操作系统无法做到,那么Python就无法做到。您可以将返回值乘以适当的数量级,以获得纳秒值,尽管可能不精确。

编辑:返回是一个浮点变量,因此逗号后的位数会有所不同,无论您的操作系统是否具有该精度级别。您可以使用"%.nf"对其进行格式化,其中n是您想要的位数,但是,如果您想要一个固定点字符串表示。

答案 2 :(得分:9)

Python 3.7 以来time.time_ns()

很容易实现
  

time()类似,但返回时间为自纪元以来的整数纳秒数。

Python 3.7版本中包含纳秒的所有新功能: PEP 564: Add new time functions with nanosecond resolution

答案 3 :(得分:5)

这取决于时钟的类型以及您的操作系统和硬件是否可以达到纳秒精度 。来自time module documentation

  

各种实时函数的精度可能低于表示其值或参数的单位所建议的精度。例如。在大多数Unix系统上,时钟“滴答”的速度仅为每秒50或100次。

在Python 3上,time模块允许您访问5种不同类型的时钟,每种时钟具有不同的属性;其中一些可能为您提供纳秒级的精确计时。使用time.get_clock_info() function查看每个时钟提供的功能以及报告的精确时间。

在我的OS X 10.11笔记本电脑上,可用的功能是:

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

所以使用time.monotonic()time.perf_counter()函数理论上会给我纳秒分辨率。两个时钟都没有给我墙上时间,只有经过的时间;这些值是其他任意的。然而,它们可用于测量花费多长时间

答案 4 :(得分:4)

您不太可能从任何当前的机器获得纳秒精度。

机器无法创建精确度,并且在不合适的地方显示有效数字不是正确的事情。

答案 5 :(得分:2)

我认为没有一种独立于平台的方式(可能是某些第三方编写了一个,但我找不到它)以便在几纳秒内获得时间;您需要以特定于平台的方式执行此操作。例如,this SO question的答案显示了如何在为“实时”操作提供librt.so系统库的平台上执行此操作。