python性能分析之line_profiler模块-耗时,效率 时间
20210203
直接用pycharm 自帶的
20201215
直接裝不上的情況下
先下載安裝文件 再安裝
line_profiler使用裝飾器(@profile)標記需要調試的函數.用kernprof.py腳本運行代碼,被選函數每一行花費的cpu時間以及其他信息就會被記錄下來。
安裝
pip3 install Cpython
pip3 install Cython git+https://github.com/rkern/line_profiler.git
代碼演示
loopdemo.py 100以內哪兩個數相加等于100.
首先是沒有優化過的雙層循環的嵌套
@profile
def foo():task = []for a in range(0, 101):for b in range(0, 101):if a + b == 100:task.append((a, b))return task@profile
def run():for item in foo():passif __name__ == '__main__':run()
運行下面的命令
kernprof -l -v loopdemo.py
-l表示逐行分析,-v用于輸出。同時會輸出一個文件:juliademo.py.lprof,后期可以對.lprof文件進行分析
輸出結果
Wrote profile results to loopdemo.py.lprof
Timer unit: 1e-06 sTotal time: 0.009856 s
File: loopdemo.py
Function: foo at line 1Line # Hits Time Per Hit % Time Line Contents
==============================================================1 @profile2 def foo():3 1 1.0 1.0 0.0 task = []45 102 47.0 0.5 0.5 for a in range(0, 101):6 10302 4741.0 0.5 48.1 for b in range(0, 101):7 10201 4975.0 0.5 50.5 if a + b == 100:8 101 91.0 0.9 0.9 task.append((a, b))9 1 1.0 1.0 0.0 return taskTotal time: 0.017778 s
File: loopdemo.py
Function: run at line 12Line # Hits Time Per Hit % Time Line Contents
==============================================================12 @profile13 def run():14 102 17747.0 174.0 99.8 for item in foo():15 101 31.0 0.3 0.2 pass
引入kernprof.py會額外的增加是時間,但是為了檢測代碼每一行發生了什么,這個影響沒什么,實際代碼運行的時候是不帶@profile裝飾器的只有需要line_profiler進行逐行分析的時候才需要加。
總用時Total time: 0.017778 s
Hits是調用次數。
%Time 列告訴我們哪行代碼占了它所在函數的消耗的時間百分比,可以看出在foo函數中最消耗時間的是判斷a+b==100,占用了50.5%的時間。
然后我對循環部分做下面的優化其他地方不變。
for a in range(0, 101):b = 100 - atask.append((a, b))return task
得到下面的結果
Wrote profile results to loopdemo.py.lprof
Timer unit: 1e-06 sTotal time: 0.000126 s
File: loopdemo.py
Function: foo at line 1Line # Hits Time Per Hit % Time Line Contents
==============================================================1 @profile2 def foo():3 1 1.0 1.0 0.8 task = []45 102 33.0 0.3 26.2 for a in range(0, 101):6 101 47.0 0.5 37.3 b = 100 - a7 101 45.0 0.4 35.7 task.append((a, b))8 1 0.0 0.0 0.0 return taskTotal time: 0.000282 s
File: loopdemo.py
Function: run at line 11Line # Hits Time Per Hit % Time Line Contents
==============================================================11 @profile12 def run():13 102 256.0 2.5 90.8 for item in foo():14 101 26.0 0.3 9.2 pass
可以發現總用時,循環體里代碼的調用次數減少了
Python是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言,其具有高可擴展性和高可移植性,具有廣泛的標準庫,受到開發者的追捧,廣泛應用于開發運維(DevOps)、數據科學、網站開發和安全。然而,它沒有因速度和空間而贏得任何稱贊,主要原因是Python是一門動態類型語言,每一個簡單的操作都需要大量的指令才能完成。
所以這更加需要開發者在使用Python語言開發項目時協調好程序運行的時間和空間。
1、分析時間耗時
分析項目消耗的時間消耗,依托于line_profiler模塊,其可以計算出執行每行代碼所需占用的CPU時間。
第1步:安裝line_profiler模塊,我是用pip安裝一直失敗,所以下載到本地進行離線安裝,指令如下所示:
pip install .\line_profiler-3.0.2-cp37-cp37m-win_amd64.whl
安裝成功效果如下所示:
第2步:分析每行代碼的運行時間,本案例Demo檢測for循環一萬次累加和while循環一萬次累加的時間,并進行對比,實現代碼如下所示:
from line_profiler import LineProfilerdef operation1():num=0for i in range(10000):num += 1def operation2():num=0while(num < 10000):num += 1if __name__ == "__main__":lprofiler = LineProfiler(operation1,operation2)lprofiler.run('operation1()')lprofiler.run('operation2()')lprofiler.print_stats()
運行程序,可見while循環速度稍微慢一些,效果如下所示:
2、分析空間耗時
memory_profiler模塊可實現對Python項目中每一個代碼的內存消耗進行分析和監控。
第1步:安裝memory_profiler庫文件,指令如下所示:
pip install memory_profiler
安裝成功效果如下所示:
第2步:分析每行代碼的空間消耗,本案例Demo檢測for循環一萬次累加和while循環一萬次累加的消耗空間,并進行對比,實現代碼如下所示:
from memory_profiler import profile@profile
def operation1():num=0for i in range(10000):num += 1@profile
def operation2():num=0while(num < 10000):num += 1if __name__ == "__main__":operation1()operation2()
由于是簡單運算消耗的內存是微乎其微的,效果如下所示:
https://www.cnblogs.com/2020-zhy-jzoj/p/13164788.html
總結
以上是生活随笔為你收集整理的python性能分析之line_profiler模块-耗时,效率 时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: virtualenv创建虚拟环境为主_多
- 下一篇: snagit屏幕截图转pdf