剖析代碼性能可以使用Python標(biāo)準(zhǔn)庫(kù)中的cProfile和pstats模塊,cProfile的 run函數(shù)可以執(zhí)行代碼并收集統(tǒng)計(jì)信息,創(chuàng)建出Stats對(duì)象并打印簡(jiǎn)單的剖析報(bào)告。Stats是pstats模塊中的類,它是一個(gè)統(tǒng)計(jì)對(duì)象。當(dāng)然,也可以使用三方工具line_profiler和memory_profiler來(lái)剖析每一行代碼耗費(fèi)的時(shí)間和內(nèi)存,這兩個(gè)三方工具都會(huì)用非常友好的方式輸出剖析結(jié)構(gòu)。
如果使用PyCharm,可以利用“Run”菜單的“Profile”菜單項(xiàng)對(duì)代碼進(jìn)行性能分析,PyCharm中可以用表格或者調(diào)用圖(Call Graph)的方式來(lái)顯示性能剖析的結(jié)果。
下面是使用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函數(shù)每行代碼的性能,需要給is_prime函數(shù)添加一個(gè)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 運(yùn)行結(jié)果如下所示。 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