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

Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.

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

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

Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.

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

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

Условие

Разработайте декоратор, который измеряет и выводит время работы обёрнутой функции. При каждом её вызове необходимо печатать, сколько времени заняло выполнение, отображая результат в секундах с точностью до миллисекунд. Декоратор должен корректно работать с функциями любого набора параметров.

Ответ

Измеряйте длительность через perf_counter и печатайте секунды форматом :.3f. Передавайте *args/**kwargs и сохраняйте результат функции.

from functools import wraps
from time import perf_counter

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

Три знака после запятой дают отображение до миллисекунд, но не гарантируют такую точность измерения. finally печатает длительность даже при исключении, не подавляя его. Считается прошедшее время, включая ожидания. Для асинхронной функции требуется обёртка с await, чтобы измерялось выполнение, а не создание корутины.

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

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

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

Подробнее