Подтвердить что ты не робот

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

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

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

import time

print time.time()

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

1267918039.01

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

1267918039.331291406

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

time. time()

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

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

EDIT: return - это переменная float, поэтому количество цифр после запятой будет различаться, независимо от того, имеет ли ваша ОС такой уровень точности или нет. Вы можете отформатировать его с помощью "%.nf", где n - это количество цифр, которое вы хотите, хотя, если вам требуется представление с фиксированной строкой.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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