Python指令碼效能分析

2021-09-07 06:35:46 字數 2378 閱讀 7462

來自:

def

foo():

sum =0

for i in range(10000):

sum +=i

suma =bar()

sumb =bar()

return

sum

defbar():

sum =0

for i in range(100000):

sum +=i

return

sum

if__name__ == "

__main__":

import

cprofile

#直接把分析結果列印到控制台

cprofile.run("

foo()")

#把分析結果儲存到檔案中,不過內容可讀性差...需要呼叫pstats模組分析結果

cprofile.run("

foo()

", "

result")

#還可以直接使用命令列進行操作

#>python -m cprofile myscript.py -o result

import

pstats

#建立stats物件

p = pstats.stats("

result")

#這一行的效果和直接執行cprofile.run("foo()")的顯示效果是一樣的

p.strip_dirs().sort_stats(-1).print_stats()

#strip_dirs():從所有模組名中去掉無關的路徑資訊

#sort_stats():把列印資訊按照標準的module/name/line字串進行排序

#print_stats():列印出所有分析資訊

#按照函式名排序

p.strip_dirs().sort_stats("

name

").print_stats()

#按照在乙個函式中累積的執行時間進行排序

#print_stats(3):只列印前3行函式的資訊,引數還可為小數,表示前百分之幾的函式資訊

p.strip_dirs().sort_stats("

cumulative

").print_stats(3)

#還有一種用法

p.sort_stats('

time

', '

cum').print_stats(.5, '

foo'

)

#先按time排序,再按cumulative時間排序,然後打倒出前50%中含有函式資訊

#如果想知道有哪些函式呼叫了bar,可使用

p.print_callers(0.5, "

bar")

#同理,檢視foo()函式中呼叫了哪些函式

p.print_callees("

foo")

執行:python -m cprofile t12.py,列印結果:

ncalls:表示函式呼叫的次數;

tottime:表示指定函式的總的執行時間,除掉函式中呼叫子函式的執行時間;

percall:(第乙個percall)等於 tottime/ncalls;

cumtime:表示該函式及其所有子函式的呼叫執行的時間,即函式開始呼叫到返回的時間;

percall:(第二個percall)即函式執行一次的平均時間,等於 cumtime/ncalls;

filename:lineno(function):每個函式呼叫的具體資訊;

另外,上面分析的時候,排序方式使用的是函式呼叫時間(cumulative),除了這個還有一些其他允許的排序方式:calls,cumulative,file,line,module,name,nfl,pcalls,stdname,time

# 增加排序方式

python -m cprofile -s cumulativet2.py #按照cumulative排序

python指令碼效能分析

在進行python開發時需要對python指令碼的效能分析,以便對python指令碼進行優化,下面使用cprofile和 pstats對python指令碼效能分析。cprofile思路 1.使用cprofile模組生成指令碼執行的統計資訊檔案 2.使用pstats格式化統計資訊,並根據需要做排序分析...

PHP提高指令碼效能要點

1.刪除重複項 array keys array flip array 速度比 array unique array 高於30 2.獲取隨機數組記錄 array mt rand 0,count array 1 速度比 array rand array 高於96 3.檢查字串僅包含字母數字字元 cty...

JavaScript網頁指令碼效能優化

訪問dom的方式對指令碼效能會產生非常大的影響。以下面 為例 if document.getelementsbytagname a length 0 這段 可以執行,本身並沒有什麼問題,但它卻不是我們期望的最優性能。細看這段 可以發現其先後兩次使用dom方法getelementsbytagname ...