Декоратор должен принимать *args и **kwargs, измерять длительность монотонным perf_counter и применять functools.wraps. Измерение в finally сохраняет отчёт и при исключении функции.
Напишите декоратор timer, который измеряет и выводит время выполнения функции; затем обеспечьте передачу аргументов и сохранение метаданных функции.
Декоратор должен принимать *args и **kwargs, измерять длительность монотонным perf_counter и применять functools.wraps. Измерение в finally сохраняет отчёт и при исключении функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Декоратор должен принимать *args и **kwargs, измерять длительность монотонным perf_counter и применять functools.wraps. Измерение в finally сохраняет отчёт и при исключении функции.
Вариант для синхронных функций:
from functools import wraps
from time import perf_counter
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
started = perf_counter()
try:
return func(*args, **kwargs)
finally:
elapsed = perf_counter() - started
print(f'{func.__name__}: {elapsed:.6f}s')
return wrapper
Возвращаемое значение и исключение исходной функции сохраняются при успешном выводе сообщения. Для async-функции нужен async wrapper с await: обычная обёртка измерит лишь создание корутины. Генератору также требуется отдельный контракт — время создания или время полного обхода.