Python 用pyinstrument做效能分析

2022-10-09 02:42:10 字數 2531 閱讀 2883

在計算密集型計算或一些web應用中,我們常常需要對**做效能分析。在python中,最原始的方法即是使用time包中的time函式(該函式以秒為計時單位):

from time import sleep, time

def func1():

sleep(0.001)

def func2():

sleep(2)

begin1 = time()

func1()

end1 = time()

begin2 = time()

func2()

end2 = time()

print("func1 consume: %f, func2 consume:%f, func3 consume: %f"\

% (end1-begin1, end2-begin2, end2-begin1))

控制台輸出如下:

func1 consume: 0.001271, func2 consume:2.000421, func3 consume: 2.001692
但是一旦函式多了起來,這種方式顯然過於繁雜。類似c語言中的cprofile,在python中,也有專門的效能分析工具pyinstrument(該庫非內建,需要使用conda/pip安裝),我們在複雜的專案中可以使用它來代替簡陋的time.time()

首先來看一下基本的使用,它的使用框架如下:

from pyinstrument import profiler

from time import sleep

def func1():

sleep(0.1)

def func2():

sleep(2)

profiler = profiler()

profiler.start()

# 這裡是你要分析的**,我們這裡分析func1和func2兩個函式

func1()

func2()

profiler.stop()

profiler.print()

可以看到,該工具也將其成功分析出了個函式的執行時間,並為我們標紅指出了執行2s的func2函式是效能瓶頸:

def func3():

sleep(0.0001)

profiler = profiler()

profiler.start()

func3()

profiler.stop()

profiler.print()

此時會顯示「no samples were recorded」,如下:

這是因為你的**執行時間小於了1ms,如果你仍然想分析這段**,你可以選擇將間隔值調到比預設的0.001(1ms)小,比如這樣:

profiler = profiler(interval=0.0001)
此時你會發現,func3也能被檢測出來了:

此外,如果你要在瀏覽器中檢視分析結果,可以使用profiler.open_in_browser()代替profiler.print()的控制台列印輸出:

也可以使用profiler.output_html()將profile以html形式輸出。

我們也可以對flask應用進行效能分析,具體的用法如下:

from flask import flask, g, make_response, request

def before_request():

if "profile" in request.args:

g.profiler = profiler()

g.profiler.start()

def after_request(response):

if not hasattr(g, "profiler"):

return response

g.profiler.stop()

output_html = g.profiler.output_html()

return make_response(output_html)

這樣程式會檢測每個request中的?profile引數,如果檢測到則會開始分析。在執行了profiler的request結束後,它會生成乙個html輸出替代掉真實的response並返回。

用python建模 用Python建模線性系統

我知道這有點老了,但一次調查就引出了這個問題。當我找不到合適的模組時,我就把它組裝起來了。不算多,但如果有人發現自己在這裡,這是個好的開始。import matplotlib.pylab as plt import numpy as np import scipy.signal def bode g...

用python比較大小 用python比較大小

1.比較 ax 為 print ax print ord a print ord x 字串是通過ascii表來進行順次為比較大小 2.is與 的區別?print 1 is true 為false print 1 true 為true print id 1 print id true is 是通過比較...

用python畫小黃人 怎麼用python畫小黃人

怎麼用python畫小黃人?前言 還記得小黃人哪只蠢萌蠢萌的單眼小黃人?就是喜歡做什麼事都喜歡逞能的那只,下面用python來實現一下,正在逃跑的小黃人。一 匯入turtle庫 import turtle as tt.pensize 4 t.speed 10 設定畫筆的大小 畫圖的速度,可以改變量值...