Декоратор, выводящий длительность выполнения функции

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

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

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

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

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

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

Условие

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

Ответ

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

Декоратор для синхронных функций:

import time
from functools import wraps

def timed(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        try:
            return func(*args, **kwargs)
        finally:
            print(f'{func.__name__}: {time.perf_counter() - start:.6f} s')
    return wrapper

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

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

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

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

Подробнее