python的語句效能分析

2021-10-10 08:28:03 字數 3462 閱讀 7796

摘要

最近利用python做**,發現程式執行的很慢,和自己的心理預估差別很大,所以想著有沒有語句效能的分析的方法了?答案是有。

本文主要參考該篇文章python模組-cprofile和line_profiler(效能分析器)

python自身提供了兩種效能分析器,此處只介紹line_profile,因為只有line_profile才可以提供語句行定位。本文僅僅簡單介紹使用方法,方便大家快速進行實踐,詳細內容請看原文。

該方法需要安裝第三方庫檔案:

pip install line_profiler

該庫一共提供了兩種方式,一種是註解的方式加在函式上方:

@profile

defmain()

:for i in

range(5

):print

("good"

)if __name__ ==

'__main__'

: main(

)

在終端使用kernprof -l 檔案.py來執行檔案,會將執行日誌列印到同級目錄下同樣檔名.py.lprof中,

另外可以使用-v引數實現控制台輸出。

kernprof -l -v 檔案.py

另外一種方式直接new 乙個profile物件,在**中寫相應邏輯進行分析

import line_profiler

import sys

defmain()

:for i in

range(5

):print

("good"

)if __name__ ==

'__main__'

: profile = line_profiler.lineprofiler(main)

# 把函式傳遞到效能分析器

profile.enable(

)# 開始分析

main(

) profile.disable(

)# 停止分析

profile.print_stats(sys.stdout)

# 列印出效能分析結果

在作實驗**的時候,我們經常會用到numpy工具,在numpy中陣列的型別是型別

我們需要注意到numpy.ndarray轉list型別,速度很快,而listnumpy.ndarray卻會慢很多很多。到底會慢多少了?這個和你的資料多大有直接關係。下面是實驗證明:

當是乙個5x5的矩陣時

a =

[[i for i in

range(5

)]for i in

range(5

)]b = np.array(a)

@profile

defmain()

:for i in

range

(50000):

toarray = np.array(a)

tolist = b.tolist(

)if __name__ ==

'__main__'

: main(

)

執行結果:

line #      hits         time  per hit   % time  line contents

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

== 39 @profile

40 def main(

): 41 50001 146701.0 2.9 6.9 for i in range(50000):

42 50000 1591802.0 31.8 74.9 toarray = np.array(a)

43 50000 386724.0 7.7 18.2 tolist = b.tolist(

)

速度大概相差4倍多。

當是乙個50x50的矩陣時:

line #      hits         time  per hit   % time  line contents

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

== 39 @profile

40 def main(

): 41 50001 173010.0 3.5 0.3 for i in range(50000):

42 50000 59411450.0 1188.2 87.0 toarray = np.array(a)

43 50000 8670757.0 173.4 12.7 tolist = b.tolist(

)

速度相差7倍多。

總之,盡量少list轉numpy.ndarray型別。

此外不要把傻傻的吧轉換放到迴圈內部,不然會導致速度非常慢,比如我傻傻的導致了程式慢了200s,也就是慢了10倍還多。

程式執行速度特別慢的時候,想想能不能利用資料結構來實現加速。比如在路徑規劃中,需要在環境中搜尋離該點的最近的障礙物點座標,此時,如果直接使用遍歷計算來搜尋這個點,時間開銷會非常大,甚至計算不出來。此時有效的使用kd樹,就會數量級的提公升程式的計算速度。因此想要程式效能真的快速提公升,就想盡方法的使用資料結構吧!(手動滑稽)

對於一次性的大批量計算,可以利用檔案儲存中間結果,比如kd樹的構建結果。而pickle就是乙個不錯的直接儲存物件型別的持久化模組。這樣在作**時,就不需要每次計算,大大的節省了做實驗的時間。

mysql 語句 效能 mysql語句效能分析

id id列數字越大越先執行,id列為null的就表是這是乙個結果集 select type 表示不需要union操作或者不包含子查詢的簡單select查詢。有連線查詢時,外層的查詢為 且只有乙個 primary 乙個需要union操作或者含有子查詢的select,位於最外層的單位查詢的select...

分析SQL語句的效能

由於要分析sql profiler捕獲的sql 語句的效能,需要找出執行頻率高,用時長的語句。sql profiler生成的表如下 create table dbo lijidownload rownumber int identity not null,eventclass int null,te...

分析SQL語句的效能

1.檢視執行時間和cpu占用時間 set statistics time on select from 表set statistics time off 結果 2.檢視查詢對i 0的操作情況 set statistics io on select from 表set statistics io of...