Python cProfile — украшенные функции, скрывающие визуализацию профиля

У меня есть базовый класс с @classmethod, который действует как декоратор для большого количества методов во многих классах-потомках.

class BaseClass():
    @classmethod
    def some_decorator(cls, method):
        @wraps(method)
        def inner_method(self, *args, **kwargs):
            # do stuff
            return method(self, *args, **kwargs)
        return inner_method


class ChildClass(BaseClass):
    @BaseClass.some_decorator
    def some_child_method(self):
        # do other stuff
        return

Когда я профилирую этот код и смотрю на него в виде дерева, я вижу тысячи вызовов some_decorator из сотен разных мест.

А потом я вижу, как some_decorator перезванивают из сотен мест, откуда он только что поступил.

Это довольно раздражает, и мне еще предстоит найти способ обойти это, ни изменить код, ни профилировать по-другому. (Используя gprof2dot atm: Как вы можете получить дерево вызовов с профилировщиками Python?)

Мысли?


person Eric Ihli    schedule 05.05.2017    source источник
comment
Поскольку декоратор обычно делает замыкание для каждой оформленной функции, не могли бы вы обновить (или сделать копию) объект кода и изменить информацию о файле и строке, чтобы она ссылалась на строку над декорированной функцией?   -  person Patrick Maupin    schedule 05.05.2017


Ответы (2)


Существуют способы создания декораторов для сохранения документов/подписей. Библиотека wrapt предоставляет множество функций для этого.

https://wrapt.readthedocs.io/en/latest/decorators.html#decorating-class-methods

В итоге это будет выглядеть примерно так:

class BaseClass():
    @wrapt.decorator
    @classmethod
    def some_decorator(cls, method, instance, *args, *kwargs):
        # do stuff
        return method(instance, *args, **kwargs)
person Eric Ihli    schedule 14.07.2017

Я не совсем уверен, но думаю, что snakeviz или запусти змейку, запусти визуализаторы сделают свою работу и отобразят правильное дерево. Вы их пробовали?

person matusko    schedule 05.05.2017