掌握Python系統管理-調試和分析腳本2- cProfile和timeit

調試和分析在Python開發中發揮着重要做用。 調試器可幫助程序員分析完整的代碼。 調試器設置斷點,而剖析器運行咱們的代碼,並給咱們執行時間的詳細信息。 分析器將識別程序中的瓶頸。咱們將瞭解pdb Python調試器,cProfile模塊和timeit模塊來計算Python代碼的執行時間。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}
  • ncalls:調用次數
  • tottime:函數花費的總時間
  • percall:tottime/ncalls
  • cumtime:函數及其子函數中花費的累計時間
  • percall:cumtime/primitive calls
    filename:lineno(function):函數信息

使用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程序運行得更快,以下所示:

  • Profile代碼,以便識別瓶頸
  • 使用內置函數和庫,所以解釋器不須要執行循環
  • 避免使用全局變量,由於Python在訪問全局變量時很是慢
  • 使用已有包

小結

在本章中,咱們瞭解了調試和分析程序的重要性。咱們瞭解了可用於調試的不一樣技術。咱們瞭解了pdb Python調試器以及如何處理異常。咱們在分析和計時腳本時學習瞭如何使用Python的cProfile和timeit模塊。咱們還學習瞭如何使腳本運行得更快。

相關文章
相關標籤/搜索