Контекстный менеджер для измерения длительности

Timer.__enter__ сохраняет perf_counter() и возвращает self, а __exit__ записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.

Короткий ответ

Что ответить на собеседовании

Timer.enter сохраняет perf_counter() и возвращает self, а exit записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.

Подробный разбор

Ответ с пояснениями

Условие

Создайте класс Timer, реализующий протокол контекстного менеджера. При входе в блок with начинается измерение времени, а при выходе из него вычисленное время сохраняется в поле elapsed экземпляра.

with Timer() as timer:
    time.sleep(1)

print(timer.elapsed)

Ответ

Timer.enter сохраняет perf_counter() и возвращает self, а exit записывает разницу в elapsed. Возврат False не подавляет исключения из измеряемого блока.

Реализация:

from time import perf_counter

class Timer:
    def __enter__(self):
        self.started = perf_counter()
        self.elapsed = None
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.elapsed = perf_counter() - self.started
        return False

После with поле elapsed содержит секунды, включая ожидание и sleep. Его значение будет заполнено и при обычном исключении внутри блока. Один экземпляр не следует использовать во вложенных одновременных измерениях: started перезапишется. Для каждого такого интервала создавайте отдельный Timer.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее