Я работаю над критическим по времени приложением в Python. Чтобы определить места и ситуации, в которых используется большая часть времени, я написал декоратор отслеживания, похожий на этот:
tracker_repository = {}
def track(name: str = "default", active: bool = None) -> Callable:
if name not in tracker_repository:
tracker_repository[name] = []
def track_f(f) -> Callable:
if not active:
return f
def exec_f(*args, **kwargs) -> Any:
start_time = time.time()
result = f(*args, **kwargs)
end_time = time.time()
tracker_repository[name].append({
"f": f,
"args": args,
"kwargs": kwargs,
"start_time": start_time,
"end_time": end_time
})
return result
return exec_f
return track_f
И я использую его так:
@track()
def some_function(input):
return "output"
К сожалению, оказывается, что использование этого декоратора отслеживания в каждой функции базы кода значительно замедляет скорость выполнения, примерно в 3 раза медленнее, чем раньше. Это верно, даже если декоратор "деактивирован". Если флаг «активный» имеет значение «Ложь», то возвращается исходная функция, поэтому exec_f
даже не затрагивается.
У вас есть идея, в чем может быть проблема, и как можно улучшить код отслеживания? оказать меньшее влияние на сроки? Или есть лучшие альтернативы для измерения времени выполнения частей программы в реальной жизни?