linuxBean14.04(41)pycallgraphでPythonのコールグラフ:その2

2015-06-28

旧ブログ

t f B! P L

前の関連記事: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/-mpython3.3ではpsutilがimportできず動きませんでした。

python3.4では動きました。

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階層目までが出力されています。

参考にしたサイト


Installing Gephi
pycallgraphはGephiの形式でも出力できるそうです。GephiはOpenJDKでは動かないそうです。

次の関連記事:linuxBean14.04(42)pycallgraphでPythonのコールグラフ:その3

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ