Для измерения времени выполнения функции с помощью декоратора в Python можно использовать модуль time. Декоратор запоминает время перед вызовом функции, вызывает функцию, затем запоминает время после выполнения и вычисляет разницу.  Ниже пример кода:
import time
def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"Функция {func.__name__} выполнилась за {execution_time:.4f} сек")
        return result
    return wrapper
@timer
def my_function():
    time.sleep(2) # Имитация работы функции
my_function()
  Этот декоратор выведет время выполнения функции my_function.
Чтобы измерить время выполнения функции с помощью декоратора в Python, можно создать декоратор, который записывает время до и после вызова функции и вычисляет разницу.
Вот пример реализации:
import time
from functools import wraps
def timer(func):
    """Декоратор для измерения времени выполнения функции."""
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()    # Время начала выполнения функции
        result = func(*args, **kwargs) # Вызов декорируемой функции
        end_time = time.time()      # Время окончания выполнения функции
        execution_time = end_time - start_time    # Время выполнения
        print(f"Функция {func.__name__} выполнилась за {execution_time:.4f} секунд")
        return result
    return wrapper
  Разберем код:
import time: Импортирует модуль time, необходимый для получения текущего времени.from functools import wraps: Импортирует wraps из модуля functools. Он помогает сохранять метаданные декорируемой функции (например, имя и docstring).def timer(func):: Определяет декоратор timer, который принимает функцию func в качестве аргумента.@wraps(func): Декоратор wraps применяется к внутренней функции wrapper.def wrapper(*args, **kwargs):: Определяет внутреннюю функцию wrapper, которая принимает произвольное количество позиционных и именованных аргументов.  Именно эта функция будет выполняться при вызове декорированной функции.start_time = time.time(): Записывает текущее время перед вызовом функции.result = func(*args, **kwargs): Вызывает декорируемую функцию с переданными аргументами и сохраняет результат.end_time = time.time(): Записывает текущее время после вызова функции.execution_time = end_time - start_time: Вычисляет время выполнения функции.print(f"Функция {func.__name__} выполнилась за {execution_time:.4f} секунд"): Выводит время выполнения в консоль, форматируя его до 4 знаков после запятой. func.__name__ предоставляет имя исходной декорируемой функции.return result: Возвращает результат, полученный от вызова декорируемой функции.return wrapper: Возвращает внутреннюю функцию wrapper, которая заменяет исходную функцию.Пример использования:
@timer
def my_slow_function(n):
    """Пример медленной функции."""
    time.sleep(n)
    return n * 2
result = my_slow_function(2)
print(f"Результат: {result}")
  В этом примере, @timer применяется к функции my_slow_function.  Когда my_slow_function(2) вызывается,  декоратор timer измеряет время ее выполнения и выводит его в консоль, а также возвращает результат функции. Output будет включать время выполнения и возвращаемый результат.