調試和分析在Python開發中發揮着重要做用。 調試器可幫助程序員分析完整的代碼。 調試器設置斷點,而剖析器運行咱們的代碼,並給咱們執行時間的詳細信息。 分析器將識別程序中的瓶頸。咱們將瞭解pdb Python調試器,cProfile模塊和timeit模塊來計算Python代碼的執行時間。python
涉及內容:程序員
trace_example.pyapp
class Student: def __init__(self, std): self.count = std def go(self): for i in range(self.count): print(i) return if __name__ == '__main__': Student(5).go()
執行:函數
$ python3 -m trace --trace trace_example.py --- modulename: trace_example, funcname: <module> trace_example.py(1): class Student: --- modulename: trace_example, funcname: Student trace_example.py(1): class Student: trace_example.py(2): def __init__(self, std): trace_example.py(5): def go(self): trace_example.py(9): if __name__ == '__main__': trace_example.py(10): Student(5).go() --- modulename: trace_example, funcname: __init__ trace_example.py(3): self.count = std --- modulename: trace_example, funcname: go trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 0 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 1 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 2 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 3 trace_example.py(6): for i in range(self.count): trace_example.py(7): print(i) 4 trace_example.py(6): for i in range(self.count): trace_example.py(8): return --- modulename: trace, funcname: _unsettrace trace.py(77): sys.settrace(None)
Q羣內免費獲取887934385 工具
分析Python程序意味着測量程序的執行時間。它衡量每一個功能所花費的時間。 Python的cProfile模塊用於分析Python程序。性能
cProfile模塊
如前所述,分析意味着測量程序的執行時間。咱們將使用cProfile Python模塊來分析程序。學習
如今,咱們將編寫一個cprof_example.py腳本並在其中編寫如下代碼:測試
mul_value = 0 def mul_numbers( num1, num2 ): mul_value = num1 * num2; print ("Local Value: ", mul_value) return mul_value mul_numbers( 58, 77 ) print ("Global Value: ", mul_value)
執行:ui
$ python3 -m cProfile cprof_example.py Local Value: 4466 Global Value: 0 6 function calls in 0.000 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 cprof_example.py:1(<module>) 1 0.000 0.000 0.000 0.000 cprof_example.py:3(mul_numbers) 1 0.000 0.000 0.000 0.000 {built-in method builtins.exec} 2 0.000 0.000 0.000 0.000 {built-in method builtins.print} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
使用timeit,咱們能夠決定咱們想要測量哪些代碼的性能。所以,咱們能夠輕鬆定義設置代碼以及咱們要單獨執行測試的代碼段。主代碼運行100萬次,這是默認時間,而設置代碼只運行一次。spa
import timeit prg_setup = "from math import sqrt" prg_code = ''' def timeit_example(): list1 = [] for x in range(50): list1.append(sqrt(x)) ''' # timeit statement print(timeit.timeit(setup = prg_setup, stmt = prg_code, number = 10000))
執行:
$ python timeit_example.py
0.00180888175964
有多種方法能夠使Python程序運行得更快,以下所示:
在本章中,咱們瞭解了調試和分析程序的重要性。咱們瞭解了可用於調試的不一樣技術。咱們瞭解了pdb Python調試器以及如何處理異常。咱們在分析和計時腳本時學習瞭如何使用Python的cProfile和timeit模塊。咱們還學習瞭如何使腳本運行得更快。