2016-09-23 8 views
0

私は、Pythonのプロファイルトレースを視覚化するためのツールを開発しています。そのためには、関数が呼び出された行を知ることが役に立ちます。プロファイラ:私の機能を呼び出すものは見つかりますか?

私は、次の簡単なプログラムがあるとします。私はそれにcProfile(python -m cProfile -o a.data a.py)を実行すると、私は次のようなデータ構造を含むマーシャリングファイルを取得

import time 

def my_sleep(x): 
    time.sleep(x) 

def main(): 
    my_sleep(1) 
    my_sleep(2) 

main() 

を:

基本的
('a.py', 3, 'my_sleep'): (2, 
          2, 
          1.4999999999999999e-05, 
          3.00576, 
          {('a.py', 6, 'main'): (2, 
                2, 
                1.4999999999999999e-05, 
                3.00576)}), 

、このmy_sleep()は、ライン6でmain()で2回呼び出され、3秒を少し上回っています。

どの機能からではなく、どの回線が呼び出されているかを調べる方法はありますか?この場合、my_sleep()は7行目が1秒間、8行目が2秒間呼び出されます。そのよう

+0

あなたの出力は、Pythonドキュメントの出力例とは異なります。あなたはそれに他のフォーマットをしていますか? https://docs.python.org/3.3/library/profile.html#instant-user-s-manual –

+0

はい、マーシャリングされたファイル( '-o a.data')として保存していますPythonインタプリタ( 'marshal.load(open( 'a.data'))')を実行し、それをpprintに渡します。 – Bai

+0

ファイルを保存せずに、コンソールに出力された出力を見てみましたか? –

答えて

0

あなたは、発信者を知るためにsys._getframe(1)を使用することがあります。

import sys 

def my_sleep(): 
    print("Line #" + str(sys._getframe(1).f_lineno)) 
    time.sleep(x) 

はそのようなことをやって覚えておいてください通常奨励しかし、それはただ一時的だ場合、それは私が推測大丈夫ですされていません。

+0

Hmm ok。私は大きなコードベースで作業していますが、私はすべての関数にprintステートメントを入れたくありません。 – Bai

関連する問題