前の関連記事:linuxBean14.04(40)pycallgraphでPythonのコールグラフ:その1
pycallgraphのオプションの働きを見てみます。graphvizのオプションも指定できるのですがそれは次の記事で解説します。
pycallgraphのオプション一覧
pq@pq-VirtualBox:~$ pycallgraph --help usage: pycallgraph [options] OUTPUT_TYPE [output_options] -- SCRIPT.py [ARG ...] Python Call Graph profiles a Python script and generates a call graph visualization. positional arguments: {graphviz,gephi} OUTPUT_TYPE graphviz Graphviz generation gephi Gephi GDF generation optional arguments: -h, --help show this help message and exit -v, --verbose Display informative messages while running -d, --debug Display debugging messages while running -t, --threaded Process traces asyncronously (Experimental) -ng, --no-groups Do not group functions by module -s, --stdlib Include standard library functions in the trace -m, --memory (Experimental) Track memory usage filtering: -i INCLUDE, --include INCLUDE Wildcard pattern of modules to include in the output. You can have multiple include arguments. -e EXCLUDE, --exclude EXCLUDE Wildcard pattern of modules to exclude in the output. You can have multiple exclude arguments. --include-pycallgraph Do not automatically filter out pycallgraph --max-depth MAX_DEPTH Maximum stack depth to trace出力型としてgraphviz以外にgephiが選択できますが、gephiはOpenJDKでは動かずOracle版Javaのインストールが必要なので試していません。
--verbose/-vは指定しても何が違うのかよくかわかりませんでした。
--debug/-dはたくさんなにかが出力されてよくわかりませんでした。
--no-groups/-ngはノードになっている関数をモジュールでグループ分けしているくくりが表示されなくなります。
このオプションをつけたほうがレイアウトが自由になって見やすくなりますね。
そもそもモジュールで括られるといっても、pyファイルごとに括られるわけではないようですので。
--stdlib/-sは標準ライブラリの呼び出しも含めて出力されます。
/usr/lib/python3.3/site.pyでは違いがわかりませんでした。
--memory/-mは
(2015.7.1追記。原因はpythonインタープリターの問題ではなくpsutilのバージョンの問題でした。psutil3.0.1ではメソッド名から「get」が除かれています。(psutil/HISTORY.rst at master · giampaolo/psutil · GitHub) pycallgraphでは/usr/local/lib/python3.3/dist-packages/pycallgraph/memory_profiler.pyでpsutil.Process().get_memory_info()を使っておりここでエラーがでます。26行目のget_memory_info()をmemory_info()に書き換えれば問題解決しました。)
メモリーに関する情報が表示されるという以外にノードが増えました。(__main__→<module>→reの先のsre_compileとか。)
フィルタリングオプションで出力する情報を制御する
--include/-i ノード名
出力するノードを限定指定できます。ワイルドカード「*」も使えます。
pycallgraph --i sysconfig* graphviz /usr/lib/python3.3/site.py
sysconfig*に限定したのでsysconfigで始まるラベルのノードだけ出力されています。
__main__は常に出力されていました。
ヘルプに書いてある「module」というのは単に「要素」という意味だけのようで、Pythonモジュールを指すものではないようです。
--exclude/-e ノード名
出力するノードを除外指定できます。ワイルドカード「*」も使えます。
pycallgraph -e sysconfig* -e posixpath* -e _find_and_load_unlocked graphviz /usr/lib/python3.3/site.py
sysconfigで始まるラベルのノード、posixpathで始まるラベルのノード、_find_and_load_unlockedというラベルのノードを除外しました。
_find_and_load_unlockedのノードから先のツリーがどうなるのかと思ったら、その先の_find_moduleノードからの新たなツリーで出力されていますね。(上図では右のツリー)
--include-pycallgraph
pycallgraph自身のノードを含めます。
pycallgraph --include-pycallgraph graphviz /usr/lib/python3.3/site.py
右にpycallgraphのノードが出力されています。
--max-depth 最大深度
出力する階層を限定できます。
pycallgraph --max-depth 3 graphviz /usr/lib/python3.3/site.py
3階層目までが出力されています。
参考にしたサイト
pycallgraphはGephiの形式でも出力できるそうです。GephiはOpenJDKでは動かないそうです。
0 件のコメント:
コメントを投稿