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