python-3.x - time.time_ns() 在 macOS 上没有正确返回纳秒?
问题描述
从 Python 3.7 开始,我们有了支持纳秒分辨率的新时间函数。但是,我不确定time.time_ns()
应该如何工作。
看下面的例子:
>>> for n in range(10):
... time.sleep(random.random())
... print((time.time(), time.time_ns(), time.monotonic_ns()))
...
(1545306865.8667252, 1545306865866727000, 439497985080)
(1545306866.084973, 1545306866084974000, 439716229679)
(1545306866.2972622, 1545306866297264000, 439928562751)
(1545306866.635714, 1545306866635716000, 440267014751)
(1545306866.745001, 1545306866745003000, 440376301646)
(1545306867.212074, 1545306867212076000, 440843415181)
(1545306867.7111092, 1545306867711111000, 441342449470)
(1545306867.792372, 1545306867792374000, 441423713091)
(1545306867.821886, 1545306867821887000, 441453223973)
(1545306868.127483, 1545306868127485000, 441758824065)
如您所见,time.time_ns()
确实以纳秒精度的整数形式返回时间,但最后一位数字始终为000
. 不应该是这样。这是一个错误还是我错过了什么?
解决方案
这是关于精度。python 中的每个时钟都有相应的精度,可以解释您所遇到的差异。让我们看看带有 MacOS Mojave 的 Macbook Pro 2018 的时钟详细信息。Python3.7 通过 brew 安装:
In [41]: time.perf_counter_ns()
Out[41]: 10464788941125
In [42]: time.process_time_ns()
Out[42]: 22502272000
In [43]: time.time_ns()
Out[43]: 1545312118561931000
In [44]: time.monotonic_ns()
Out[44]: 10477720411470
In [45]: time.get_clock_info('perf_counter')
Out[45]: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
In [46]: time.get_clock_info('process_time')
Out[46]: namespace(adjustable=False, implementation='clock_gettime(CLOCK_PROCESS_CPUTIME_ID)', monotonic=True, resolution=1.0000000000000002e-06)
In [47]: time.get_clock_info('time')
Out[47]: namespace(adjustable=True, implementation='clock_gettime(CLOCK_REALTIME)', monotonic=False, resolution=1.0000000000000002e-06)
In [48]: time.get_clock_info('monotonic')
Out[48]: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
请注意implementation
和resolution
。以下是相同的信息,但来自运行在 Ubuntu 服务器上的 VM:
>>> time.perf_counter_ns()
4094438601446186
>>> time.process_time_ns()
35344006
>>> time.time_ns()
1545312252720125938
>>> time.monotonic_ns()
4094449881239590
>>> time.get_clock_info('perf_counter')
namespace(adjustable=False, implementation='clock_gettime(CLOCK_MONOTONIC)', monotonic=True, resolution=1e-09)
>>> time.get_clock_info('time')
namespace(adjustable=True, implementation='clock_gettime(CLOCK_REALTIME)', monotonic=False, resolution=1e-09)
>>> time.get_clock_info('process_time')
namespace(adjustable=False, implementation='clock_gettime(CLOCK_PROCESS_CPUTIME_ID)', monotonic=True, resolution=1e-09)
>>> time.get_clock_info('monotonic')
namespace(adjustable=False, implementation='clock_gettime(CLOCK_MONOTONIC)', monotonic=True, resolution=1e-09)
如您所见,每个时钟都有不同的实现和精度,具体取决于平台。在 MacOS 上,时钟精度process_time
和time
时钟设置1e-06
为微秒。这就解释了差异。
您还可以使用time.clock_getres
来获得精度:
In [51]: time.clock_getres(time.CLOCK_REALTIME)
Out[51]: 1.0000000000000002e-06
进一步阅读:
推荐阅读
- php - SQL 如何使用 var php 条件进行选择查询
- reactjs - 如何修复错误无法使用“xx”来使用反应打字稿键入内在属性和道具?
- amazon-web-services - 获取参数 VS 获取参数
- json - 使用 jq 转换包含键/值字符串的列表
- c# - Oxyplot:对 TrackerFormatString 参数的操作
- ssl - Prestashop 上的混合内容与 smartblog-v3.0.0 模块
- javascript - 如何在 JavaScript 中查找 HTML 元素的位置?
- python - 悬停在函数定义上时查看文档的乳胶翻译
- django - 如何从 Django Web 服务器在远程服务器(Windows 10)中运行批处理文件
- compiler-construction - 解决 ply yacc 中的 shift/reduce 冲突