Декоратор для измерения времени работы функции

Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.

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

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

Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.

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

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

Условие

Создайте декоратор, который будет измерять длительность выполнения оборачиваемой функции и выводить полученное время на экран.

Ответ

Оберните вызов функции измерением perf_counter() до и после, сохранив результат и метаданные через wraps. finally позволяет вывести длительность даже при исключении.

Пример для синхронной функции:

from functools import wraps
from time import perf_counter

def measure_time(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

Это wall-clock длительность, включающая ожидание. Для async-функции обёртка должна быть async def и ожидать await func(...), иначе измерится лишь создание coroutine. В приложении вместо print обычно используют настроенный логгер или метрику.

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

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

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

Подробнее