3. Написать простой декоратор, измеряющий время выполнения функции

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

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

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

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

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

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

Условие

3. Написать простой декоратор, измеряющий время выполнения функции

Ответ

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

from functools import wraps
from time import perf_counter

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

perf_counter подходит для измерения длительности, в отличие от календарных часов. При нормальной работе вывода результат и исключение исходной функции сохраняются. Для production лучше неблокирующая наблюдаемость, не способная замаскировать основную ошибку. Async-функцию нужно измерять вокруг await, а генератор — по отдельному контракту.

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

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

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

Подробнее