Получить 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
системная библиотека для операций в реальном времени.