2016-09-23 106 views
0

我正在研究一個可視化Python配置文件跟蹤的工具,爲此,知道從哪一行調用函數會很有用。profiler:我可以找到什麼叫我的功能?

假設我有以下簡單的程序:

import time 

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

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

main() 

如果我在它(python -m cProfile -o a.data a.py)運行CPROFILE,我得到包含以下數據結構的封文件:

('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()調用了兩次,這加起來略多於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

嗯好的。儘管我正在處理一個大型的代碼庫,但我不想在每個函數中都放置一個打印語句。 – Bai

相關問題