Используйте perf_counter до и после вызова, wraps для метаданных и finally, если время нужно фиксировать даже при исключении. Такой вариант предназначен для синхронной функции.
3. Написать простой декоратор, измеряющий время выполнения функции
Используйте 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, а генератор — по отдельному контракту.