Какие методы из библиотеки time можно использовать для измерения времени, если системные часы сломались
Что проверяют
Понимаете ли вы разницу между «настенными» часами и монотонными. Под «сломанными часами» обычно имеют в виду не поломку, а скачки: NTP подвёл время, администратор перевёл часы, машина проснулась после сна. Следом почти всегда спрашивают, почему time.time() для замера интервалов не годится.
Как отвечать
Начните с того, что time.time() отдаёт системное время от эпохи, и оно может прыгнуть назад или вперёд. Для интервалов в модуле time есть часы, которые от этого не зависят:
time.monotonic(): монотонные часы, никогда не идут назад. Точка отсчёта не определена, смысл имеет только разность двух вызовов. Подходит для таймаутов, дедлайнов, пауз между повторами;time.perf_counter(): тоже монотонные часы, но с наибольшим доступным разрешением. Им меряют производительность, иtimeitпо умолчанию использует именно его;time.process_time(): процессорное время текущего процесса, пользовательское плюс системное. Время вsleepи ожидание ввода-вывода не входят, так что это ответ на вопрос «сколько считал процессор», а не «сколько прошло»;time.thread_time(): то же самое для отдельного потока;- варианты с
_ns:monotonic_ns(),perf_counter_ns()возвращают целые наносекунды и не теряют точность float на больших значениях.
Хороший штрих: time.get_clock_info("monotonic") показывает реализацию, разрешение и флаг adjustable, по нему видно, могут ли эти часы подвести извне. Если нужно учитывать и время, пока система спала, на Linux есть time.clock_gettime(time.CLOCK_BOOTTIME).
Итог для ответа: для интервалов и таймаутов monotonic(), для бенчмарков perf_counter(), для нагрузки на CPU process_time(), а time() только для реальной даты и времени.
Где спотыкаются
Называют time.clock(). Её убрали ещё в Python 3.8, код с ней просто упадёт с AttributeError.
Пытаются вывести из perf_counter() дату или сравнить значения из разных процессов. Точка отсчёта не определена, само по себе число ничего не значит.
Путают process_time() с длительностью. Запрос, который две секунды ждал сеть, покажет почти ноль процессорного времени, и кандидат делает вывод, что код работает мгновенно.