Напишите декоратор timer, который измеряет и выводит время выполнения функции; затем обеспечьте передачу аргументов и сохранение метаданных функции.

Декоратор должен принимать *args и **kwargs, измерять длительность монотонным perf_counter и применять functools.wraps. Измерение в finally сохраняет отчёт и при исключении функции.

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

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

Декоратор должен принимать *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: обычная обёртка измерит лишь создание корутины. Генератору также требуется отдельный контракт — время создания или время полного обхода.

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

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

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

Подробнее