日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python性能分析之line_profiler模块-耗时,效率 时间

發(fā)布時(shí)間:2023/11/28 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python性能分析之line_profiler模块-耗时,效率 时间 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

20210203
直接用pycharm 自帶的

20201215
直接裝不上的情況下
先下載安裝文件 再安裝

line_profiler使用裝飾器(@profile)標(biāo)記需要調(diào)試的函數(shù).用kernprof.py腳本運(yùn)行代碼,被選函數(shù)每一行花費(fèi)的cpu時(shí)間以及其他信息就會被記錄下來。

安裝

pip3 install Cpython
pip3 install Cython git+https://github.com/rkern/line_profiler.git

代碼演示
loopdemo.py 100以內(nèi)哪兩個(gè)數(shù)相加等于100.
首先是沒有優(yōu)化過的雙層循環(huán)的嵌套

@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()

運(yùn)行下面的命令

kernprof -l -v loopdemo.py

-l表示逐行分析,-v用于輸出。同時(shí)會輸出一個(gè)文件:juliademo.py.lprof,后期可以對.lprof文件進(jìn)行分析
輸出結(jié)果

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會額外的增加是時(shí)間,但是為了檢測代碼每一行發(fā)生了什么,這個(gè)影響沒什么,實(shí)際代碼運(yùn)行的時(shí)候是不帶@profile裝飾器的只有需要line_profiler進(jìn)行逐行分析的時(shí)候才需要加。
總用時(shí)Total time: 0.017778 s
Hits是調(diào)用次數(shù)。

%Time 列告訴我們哪行代碼占了它所在函數(shù)的消耗的時(shí)間百分比,可以看出在foo函數(shù)中最消耗時(shí)間的是判斷a+b==100,占用了50.5%的時(shí)間。

然后我對循環(huán)部分做下面的優(yōu)化其他地方不變。

    for a in range(0, 101):b = 100 - atask.append((a, b))return task

得到下面的結(jié)果

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

可以發(fā)現(xiàn)總用時(shí),循環(huán)體里代碼的調(diào)用次數(shù)減少了

Python是一個(gè)高層次的結(jié)合了解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,其具有高可擴(kuò)展性和高可移植性,具有廣泛的標(biāo)準(zhǔn)庫,受到開發(fā)者的追捧,廣泛應(yīng)用于開發(fā)運(yùn)維(DevOps)、數(shù)據(jù)科學(xué)、網(wǎng)站開發(fā)和安全。然而,它沒有因速度和空間而贏得任何稱贊,主要原因是Python是一門動態(tài)類型語言,每一個(gè)簡單的操作都需要大量的指令才能完成。

所以這更加需要開發(fā)者在使用Python語言開發(fā)項(xiàng)目時(shí)協(xié)調(diào)好程序運(yùn)行的時(shí)間和空間。

1、分析時(shí)間耗時(shí)
分析項(xiàng)目消耗的時(shí)間消耗,依托于line_profiler模塊,其可以計(jì)算出執(zhí)行每行代碼所需占用的CPU時(shí)間。

第1步:安裝line_profiler模塊,我是用pip安裝一直失敗,所以下載到本地進(jìn)行離線安裝,指令如下所示:

pip install .\line_profiler-3.0.2-cp37-cp37m-win_amd64.whl
安裝成功效果如下所示:

第2步:分析每行代碼的運(yùn)行時(shí)間,本案例Demo檢測for循環(huán)一萬次累加和while循環(huán)一萬次累加的時(shí)間,并進(jìn)行對比,實(shí)現(xiàn)代碼如下所示:

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()

運(yùn)行程序,可見while循環(huán)速度稍微慢一些,效果如下所示:


2、分析空間耗時(shí)
memory_profiler模塊可實(shí)現(xiàn)對Python項(xiàng)目中每一個(gè)代碼的內(nèi)存消耗進(jìn)行分析和監(jiān)控。

第1步:安裝memory_profiler庫文件,指令如下所示:

pip install memory_profiler
安裝成功效果如下所示:

第2步:分析每行代碼的空間消耗,本案例Demo檢測for循環(huán)一萬次累加和while循環(huán)一萬次累加的消耗空間,并進(jìn)行對比,實(shí)現(xiàn)代碼如下所示:

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()

由于是簡單運(yùn)算消耗的內(nèi)存是微乎其微的,效果如下所示:


https://www.cnblogs.com/2020-zhy-jzoj/p/13164788.html

總結(jié)

以上是生活随笔為你收集整理的python性能分析之line_profiler模块-耗时,效率 时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。