剖析代碼性能可以使用Python標準庫中的cProfile和pstats模塊,cProfile的 run函數可以執行代碼并收集統計信息,創建出Stats對象并打印簡單的剖析報告。Stats是pstats模塊中的類,它是一個統計對象。當然,也可以使用三方工具line_profiler和memory_profiler來剖析每一行代碼耗費的時間和內存,這兩個三方工具都會用非常友好的方式輸出剖析結構。
如果使用PyCharm,可以利用“Run”菜單的“Profile”菜單項對代碼進行性能分析,PyCharm中可以用表格或者調用圖(Call Graph)的方式來顯示性能剖析的結果。
下面是使用cProfile剖析代碼性能的例子。
example.py import cProfile def is_prime(num): for factor in range(2, int(num ** 0.5) + 1): if num % factor == 0: return False return True class PrimeIter: def __init__(self, total): self.counter = 0 self.current = 1 self.total = total def __iter__(self): return self def __next__(self): if self.counter < self.total: self.current += 1 while not is_prime(self.current): self.current += 1 self.counter += 1 return self.current raise StopIteration() cProfile.run('list(PrimeIter(10000))')
如果使用line_profiler三方工具,可以直接剖析is_prime函數每行代碼的性能,需要給is_prime函數添加一個profiler裝飾器,代碼如下所示。 @profiler def is_prime(num): for factor in range(2, int(num ** 0.5) + 1): if num % factor == 0: return False return True 安裝line_profiler。 pip install line_profiler 使用line_profiler。 kernprof -lv example.py 運行結果如下所示。 Line # Hits Time Per Hit % Time Line Contents
============================================================== 1 @profile 2 def is_prime(num): 3 86624 48420.0 0.6 50.5 for factor in range(2, int(num ** 0.5) + 1): 4 85624 44000.0 0.5 45.9 if num % factor == 0: 5 6918 3080.0 0.4 3.2 return False 6 1000 430.0 0.4 0.4 return True