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

Для измерения времени выполнения функции с помощью декоратора в 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 будет включать время выполнения и возвращаемый результат.

0