Получить POSIX/Unix время в секундах и наносекундах в Python?

Я пытался найти способ получить время с 1970-01-01 00:00:00 UTC в секундах и наносекундах в python, и я не могу найти ничего, что дало бы мне правильную точность.

Я пытался использовать модуль времени, но эта точность составляет только микросекунды, поэтому я попробовал следующий код:

import time

print time.time()

который дал мне такой результат:

1267918039.01

Однако мне нужен результат, который выглядит следующим образом:

1267918039.331291406

Кто-нибудь знает возможный способ выразить время UNIX в секундах и наносекундах? Я не могу найти способ установить правильную точность или получить результат в правильном формате. Спасибо за любую помощь

6 ответов

Начиная с Python 3.7 этого легко достичь time.time_ns()

Похожий на time() но возвращает время как целое число наносекунд с начала эпохи.

Все новые функции, которые включают наносекунды в выпуске Python 3.7: PEP 564: добавление новых функций времени с разрешением наносекунд

Ваша точность просто теряется из-за форматирования строки:

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

Это зависит от типа часов, вашей ОС и аппаратного обеспечения, или нет, вы даже не можете получить точность в наносекунду. От time документация модуля:

Точность различных функций реального времени может быть меньше, чем предлагается единицами, в которых выражается их значение или аргумент. Например, в большинстве систем Unix часы "тикают" только 50 или 100 раз в секунду.

На Python 3 time модуль дает вам доступ к 5 различным типам часов, каждый из которых имеет разные свойства; некоторые из них могут предложить вам точность с точностью до наносекунды. Использовать time.get_clock_info() функция, чтобы увидеть, какие функции предлагает каждый часы и в каком времени точности сообщается.

На моем ноутбуке с 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() функции теоретически дали бы мне наносекундное разрешение. Ни одно из часов не дает мне время на стене, только прошедшее время; значения в противном случае являются произвольными. Однако они полезны для измерения того, как долго что-то заняло.

Проблема, вероятно, связана с вашей ОС, а не с Python. Смотрите документацию time модуль: http://docs.python.org/library/time.html

time.time()

Вернуть время как число с плавающей запятой, выраженное в секундах с начала эпохи в UTC. Обратите внимание, что хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда. Хотя эта функция обычно возвращает неубывающие значения, она может вернуть более низкое значение, чем предыдущий вызов, если системные часы были установлены обратно между двумя вызовами.

Другими словами: если ваша ОС не может этого сделать, Python не может этого сделать. Вы можете умножить возвращаемое значение на соответствующий порядок величины, чтобы получить значение наносекунды, хотя, возможно, неточным.

РЕДАКТИРОВАТЬ: возвращаемое значение является переменной с плавающей точкой, поэтому число цифр после запятой будет варьироваться, независимо от того, имеет ли ваша ОС этот уровень точности или нет. Вы можете отформатировать его с "%.nf" где n это количество цифр, которое вы хотите, однако, если вам нужно представление строки с фиксированной запятой.

Маловероятно, что вы на самом деле получите наносекундную точность от любой текущей машины.

Машина не может создавать точность, и отображение значащих цифр там, где это не подходит, не является правильным.

Я не думаю, что есть независимый от платформы способ (возможно, какая-то третья сторона закодировала его, но я не могу его найти), чтобы получить время в наносекундах; Вы должны сделать это в зависимости от платформы. Например, ответ на этот вопрос SO показывает, как это сделать на платформе, которая предоставляет librt.so системная библиотека для операций в реальном времени.

Другие вопросы по тегам