Эффективность отслеживания времени выполнения в Python - PullRequest
0 голосов
/ 25 марта 2020

Я работаю над критическим по времени приложением в 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 даже не затрагивается.

У вас есть идея, в чем может быть проблема, и как можно улучшить код отслеживания? оказать меньшее влияние на сроки? Или есть лучшие альтернативы для измерения времени выполнения частей программы в реальной жизни?

...