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

Измерьте разницу time.perf_counter до и после вызова и умножьте на 1000. finally позволяет вывести длительность даже при исключении.

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

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

Измерьте разницу time.perf_counter до и после вызова и умножьте на 1000. finally позволяет вывести длительность даже при исключении.

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

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

Условие

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

Ответ

Измерьте разницу time.perf_counter до и после вызова и умножьте на 1000. finally позволяет вывести длительность даже при исключении.

from functools import wraps
from time import perf_counter

def timed_ms(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        started = perf_counter()
        try:
            return func(*args, **kwargs)
        finally:
            elapsed_ms = (perf_counter() - started) * 1000
            print(f'{func.__name__}: {elapsed_ms:.3f} мс')
    return wrapper

Возвращаемое значение и исключения исходной функции сохраняются. Измеряется прошедшее время, включая ожидание I/O, а не только процессорное время. Для async def нужна async-обёртка с await, иначе будет измерено создание объекта корутины, а не её выполнение. Для серьёзного профилирования единичного измерения недостаточно.

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

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

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

Подробнее