2017-10-02 4 views
0

私はテストスイートを持っていて、テストしています。私がfrom memory_profiler import profileを適切なファイルの先頭に置き、プロファイリングしたい機能を@profileで装飾し、標準的な方法でpython TestThing.pyで実行すると、すばらしい行単位の結果が得られます。Pythonでunittestsをタイムプロファイリングするにはどうすればよいですか?

しかし、この方法では、line_profilerはパッケージには含まれていません。私がそれを使って何かをプロファイルできる唯一の方法は、kernprof -l -v thing.pyです。私が単体テストで使用すると、テストは実行されません(実際には意外ではありません)。結果は生成されません。私のテストと、それらが使用するコードを、memory_profilerに類似した方法でタイムプロファイリングするにはどうすればよいですか?当然の

答えて

0

、あなたはimport line_profilerできます

import line_profiler 

profiler = line_profiler.LineProfiler() 


@profiler 
def foo(): 
    for i in range(10): 
     print(i) 


foo() 

profiler.dump_stats('foo.lprof') 

foo.lprofに格納された結果。

か、あなたが呼び出した後デコレータ、印刷結果のようなmemory_profilerを包むことができます:

def profile_and_show(func): 
    profiler = line_profiler.LineProfiler(func) 
    def _(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     finally: 
      lstats = profiler.get_stats() 
      line_profiler.show_text(lstats.timings, lstats.unit) 
    return _ 
+0

これの修正が働いている:輸入line_profilerを、そのクラスの静的プロファイラ= line_profiler.LineProfilerを宣言します。次に@profilerで関数を修飾します。次に、これらの関数の最後にClassName.profiler.dump_stats( 'method.lprof')を呼び出します。そして、python -m line_profiler method.lprofでそれらを読んでください。しかし、このばかげていないですか?後で削除する必要があるコードにその行を追加したくないのです。よりクリーンな方法がありますか? – pvlkmrv

+0

どの部分がきれいではありませんか? – georgexsh

+0

memory_profilerの場合、私はオブジェクトをインスタンス化する必要はなく、プロファイリングされた関数が実行された後にdump_statsメソッドを呼び出す心配はありません。私は時間プロファイリングのこの方法で作業することができますが、それは必要以上の仕事です。 – pvlkmrv

関連する問題