Ответ 1
Ваша точность просто теряется из-за форматирования строки:
>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
Я пытаюсь найти способ получить время с 1970-01-01 00:00:00 UTC в секундах и наносекундах на питоне, и я не могу найти ничего, что даст мне правильную точность.
Я пробовал использовать модуль времени, но эта точность - только микросекунды, поэтому код, который я пробовал, был:
import time
print time.time()
который дал мне такой результат:
1267918039.01
Однако мне нужен результат, который выглядит так:
1267918039.331291406
Кто-нибудь знает, как можно выразить время UNIX в секундах и наносекундах? Я не могу найти способ установить правильную точность или получить результат в правильном формате. Спасибо за любую помощь
Ваша точность просто теряется из-за форматирования строки:
>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
Проблема, вероятно, связана с вашей ОС, а не с Python. См. Документацию модуля time
: http://docs.python.org/library/time.html
time.
time()
Возвращает время как плавающую точку число, выраженное в секундах с момента эпохи, в UTC. Обратите внимание, что хотя время всегда возвращается как число с плавающей запятой, не все системы обеспечивают время лучше точность менее 1 секунды. Хотя это функция нормально возвращается неубывающие значения, он может вернуть более низкое значение, чем предыдущий вызов, если системные часы были установлены назад между двумя вызовами.
Другими словами: если ваша ОС не может этого сделать, Python не сможет этого сделать. Вы можете умножить возвращаемое значение на соответствующий порядок величины, чтобы получить наносекундное значение, хотя и неточно, как может быть.
EDIT: return - это переменная float, поэтому количество цифр после запятой будет различаться, независимо от того, имеет ли ваша ОС такой уровень точности или нет. Вы можете отформатировать его с помощью "%.nf"
, где n
- это количество цифр, которое вы хотите, хотя, если вам требуется представление с фиксированной строкой.
Маловероятно, что вы действительно получите наносекундную точность от любой текущей машины.
Машина не может создавать точность и отображать значимые цифры, если это не подходит, это не правильная вещь.
Это зависит от типа часов и вашей ОС и аппаратного обеспечения, или нет, вы даже можете получить наносекундную точность вообще. Из документации 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()
функции теоретически дадут мне наносекундное разрешение. Ни один из часов не дает мне время на стене, только прошедшее время; значения иначе произвольны. Однако они полезны для измерения того, сколько времени прошло.
Я не думаю, что существует независимый от платформы способ (возможно, какая-то третья сторона закодировала, но я не могу ее найти), чтобы получить время в наносекундах; вам нужно сделать это с помощью платформы. Например, в ответе this SO question показано, как это сделать на платформе, которая предоставляет системную библиотеку librt.so
для операций "реального времени".
Поскольку Python 3.7 легко достичь с помощью time.time_ns()
Подобно
time()
но возвращает время как целое число наносекунд с эпохи.
Все новые функции, включающие наносекунды в версии Python 3.7: PEP 564: добавление новых функций времени с разрешением наносекунд