2017-05-05 9 views
1

私は@classmethodの基底クラスを持ち、多くの子孫クラスで多数のメソッドのデコレータとして機能します。プロファイルの視覚化を隠すPython cProfile - 装飾された関数

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を使用して:How can you get the call tree with python profilers?

思考?

+0

を、あなたは更新(またはのコピーを作成する)ことができませんでしたコードオブジェクトを編集し、装飾された関数の上の行を参照するようにファイルと行情報を変更しますか? –

答えて

0

私は完全にはわかりませんが、snakevizまたはrun snake runビジュアライザーが仕事をして正しいツリーを表示すると思います。あなたはそれらを試しましたか?

0

デコレータを作成してドキュメント/署名を保存する方法があります。ラップされたライブラリは、その目的のために多くの機能を提供します。

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) 
関連する問題