15

コマンドラインからpycallgraphを使用して、比較的単純なプログラムのコールグラフをプロファイルおよび描画しています。ただし、-sコマンドラインオプションを使用しなくても、結果のイメージには標準ライブラリ(スレッド、json、ソケット)の内部が含まれます。-eオプションを使用してこれらのモジュールを除外しても効果はなく、-iを使用するとコールグラフが空になります。cProfileも試しましたが、メインスレッドのみをグラフ化しています。

コード内の呼び出しのみを表示するようにpycallgraphを作成するにはどうすればよいですか?現在の厄介な結果は役に立たない。

編集: easy_installから入手できる0.5.1を使用しています。pycallgraph ./cursesclient.pyを実行すると、次のように出力されます乱雑なコールグラフ。ご覧のとおり、pycallgraphは、モジュールjson、re、encodings、socket、およびthreadingの内部を示しています。Reとencodingsは、私のコードでは直接呼び出されることはなく、それぞれjsonとsocketを介して呼び出されます。

4

2 に答える 2

13

Pycallgraphは、コールグラフから除外したいモジュール、クラス、または関数を除外するためのフィルタリング機能を提供します。トレースを開始してpycallgraphに渡す前に、次の関数を定義する必要があります

def filtercalls(call_stack, modul, clas, func, full):
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json']
    func_ignore = ['CustomFunctionName','pdbcall']
    clas_ignore = ['pdb']
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore

pycallgraphトレースの開始は

pycallgraph.start_trace(filter_func=filtercalls)

このようにして、filtercallsで提供するモジュール、クラス、または関数はすべて削除されます。モジュール名だけを提供する標準ライブラリでは、多くの場合、十分ではないことに注意してください。したがって、mod_ignoreにnumpyを含めると、numpy.coreが含まれることになります。

于 2013-08-14T15:25:06.737 に答える
5

pycallgraphには、コードのセクションを除外するために使用できる、文書化されていないstop_trace()メソッドがあります。何かのようなもの

import pycallgraph
import mycode
import stuff_i_dont_want_to_see

pycallgraph.start_trace()
#Initializations

pycallgraph.stop_trace()
stuff_i_dont_want_to_see()
pycallgraph.start_trace()

mycode.things()
pycallgraph.make_dot_graph('cleaner_graph.png')

それはあなたが求めているものですか?

ソース

于 2012-11-24T15:29:55.730 に答える