time.time_ns () не корректно восстанавливает наносекунды в macOS? - PullRequest
0 голосов
/ 20 декабря 2018

Начиная с 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.Что не должно быть так.Это ошибка или я что-то упустил?

1 Ответ

0 голосов
/ 20 декабря 2018

Речь идет о точности.Каждые часы в Python имеют соответствующую точность, которая объясняет разницу, которую вы испытываете.Давайте посмотрим детали часов от Macbook Pro 2018 с MacOS Mojave.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:

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

Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...