調試和分析在Python開發中發揮着重要做用。 調試器可幫助程序員分析完整的代碼。 調試器設置斷點,而剖析器運行咱們的代碼,並給咱們執行時間的詳細信息。 分析器將識別程序中的瓶頸。咱們將瞭解pdb Python調試器,cProfile模塊和timeit模塊來計算Python代碼的執行時間。python
涉及內容:程序員
trace_example.pybash
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()複製代碼
執行:app
$ 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)複製代碼
分析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)複製代碼
執行:學習
$ 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萬次,這是默認時間,而設置代碼只運行一次。測試
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))複製代碼
執行:ui
$ python timeit_example.py
0.00180888175964複製代碼
有多種方法能夠使Python程序運行得更快,以下所示:
在本章中,咱們瞭解了調試和分析程序的重要性。咱們瞭解了可用於調試的不一樣技術。咱們瞭解了pdb Python調試器以及如何處理異常。咱們在分析和計時腳本時學習瞭如何使用Python的cProfile和timeit模塊。咱們還學習瞭如何使腳本運行得更快。