我想獲得分析器的統計數據,不是通過調用次數來分組,而是通過花費的時間來分組,而不是通過自然執行順序。cProfiler:如何通過執行順序獲取統計信息?
例如,如果我們使用cProfiler下一個簡單的程序:
def my_sleep0():
sleep(0.05)
def my_sleep1():
sleep(0.15)
my_sleep2()
def my_sleep2():
my_sleep3()
def my_sleep3():
sleep(0.1)
if __name__ == '__main__':
p = Profiler('./') # a wrapper for cProfiler, cProfiler starts here
i = 10
for i in range(1, 5):
i += 100
my_sleep0()
my_sleep1()
my_sleep1()
# cProfiler destructs and ends here
我想自然的執行順序的統計,例如:
Ordered by: execution
calling_function cumtime backtrace
test.py:36(my_sleep0) <cumtime> test.py:43()
test.py:39(my_sleep1) <cumtime> test.py:44()
test.py:43(my_sleep2) <cumtime> test.py:20 called by test.py:44(my_sleep1)
test.py:43(my_sleep3) <cumtime> test.py:25 called by test.py:20(my_sleep1)->test.py:26(my_sleep2)
test.py:39(my_sleep1) <cumtime> test.py:45()
test.py:43(my_sleep2) <cumtime> test.py:20 called by test.py:25(my_sleep1)
test.py:43(my_sleep3) <cumtime> test.py:25 called by test.py:20(my_sleep1)->test.py:26(my_sleep2)
...
(<cumtime>
是一個數字的時間。 )
Python中是否有方法實現它?怎麼樣?
加法。
我的探查的代碼()不現在就做:
class Profiler:
def __init__(self, dir):
self._profiler = cProfile.Profile()
self._profiler.enable()
self._dir = dir # profiler output is "/tmp/profiler/{key}/<files_here>"
def stop(self):
profilerDir = self._dir
self._profiler.disable()
with open(os.path.join(profilerDir, datetime.now().strftime("%d-%m-%y %H.%M.%S")), 'w') as f:
stat = pstats.Stats(self._profiler, stream = f).sort_stats('pcalls')
stat.print_stats()
stat.print_callers()
stat.print_callees()
def __del__(self):
self.stop()
@KillianDS好的。但看起來cProfiler沒有這個功能。我想知道是否有工具或方法來實現我想要的。 – sergzach
您可以按行排序。爲什麼要按(第一個?)執行時間排序?這對你有什麼好處? – KillianDS
@KillianDS我想按執行順序排序,而不是按執行時間排序。打擾一下。 – sergzach