Используйте perf_counter() при входе и выходе из контекстного менеджера, а вывод поместите в finally. Формат .3f покажет секунды с тремя знаками после запятой, то есть до миллисекунд.
Контекстный менеджер для измерения длительности выполнения кода
Используйте perf_counter() при входе и выходе из контекстного менеджера, а вывод поместите в finally. Формат .3f покажет секунды с тремя знаками после запятой, то есть до миллисекунд.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте контекстный менеджер, который будет фиксировать и выводить время, затраченное на выполнение кода внутри конструкции with.
- При входе в блок with необходимо запустить таймер.
- При выходе из блока with следует вычислить прошедшее время и вывести его.
- Результат выводится в секундах с точностью до миллисекунды.
Ответ
Используйте perf_counter() при входе и выходе из контекстного менеджера, а вывод поместите в finally. Формат .3f покажет секунды с тремя знаками после запятой, то есть до миллисекунд.
Вариант через contextmanager:
from contextlib import contextmanager
from time import perf_counter
@contextmanager
def timer():
started = perf_counter()
try:
yield
finally:
print(f'{perf_counter() - started:.3f} s')
with timer():
total = sum(range(1000))
Измеряется прошедшее время, включая ожидания, а не только CPU. Исключение внутри with не подавляется; таймер выводится и при ошибке. Три знака форматирования не означают, что длительность любой операции измеряется с абсолютной точностью в миллисекунду.