python web框架性能對比測試


目前比較流行的python web框架:Flask、Tornado、Snaic、FastAPI、Quart、aiohttp
如下來自github上一個性能對比圖:
image.png
https://github.com/vibora-io/vibora

對於上圖的測試好像是請求hello world的測試,這種方式在實際應用明顯不可靠,所以我本地通過讀取mysql數據方式進行了測試。

環境准備

  1. 測試環境
    python3.8
    框架對應版本:
aiohttp           3.6.2     
fastapi           0.55.1    
Flask             1.1.2     
Quart             0.12.0      
sanic             20.3.0     
tornado           6.0.4   
  1. 測試工具Jmeter
  2. 測試數據 :mysql數據庫中comment表中插入了10000+條真實評論數據,后台運行時隨機取500條數據進行分詞,請求測試的時候用分好的詞語去查詢mysql(這樣保證了每次數據的隨機,及mysql查詢的隨機)
#!/usr/bin/python3
import pymysql
import jieba
import random
import json

db = pymysql.connect("xxxx","xx","xxx","xxx" )

keyword_set = set()
def init_keyword_set():
    id_list = []
    for i in range(500):
        id_list.append(str(random.randint(0,10000)))
    id_strs = ','.join(id_list)

    cursor = db.cursor(pymysql.cursors.DictCursor)
     
    # 使用 execute()  方法執行 SQL 查詢 
    cursor.execute("SELECT content from comment where  id in (%s) and content is not null"%id_strs)
     
    # 使用 fetchone() 方法獲取單條數據.
    data = cursor.fetchall()
    for item in data:
        words = jieba.lcut(item['content'],cut_all=False)
        keyword_set.update([x for x in words if len(x)>1])
    print('len---------',len(keyword_set))

init_keyword_set()

def get_mysql():
    # 使用 cursor() 方法創建一個游標對象 cursor
    cursor = db.cursor(pymysql.cursors.DictCursor)
    keyword = keyword_set.pop()
    # 使用 execute()  方法執行 SQL 查詢 
    cursor.execute("SELECT id,content from comment where content like '%%%s%%' limit 10"%keyword)
     
    # 使用 fetchone() 方法獲取單條數據.
    data = cursor.fetchall()
    # return data
    return json.dumps(data)
 
if __name__ == '__main__':
    get_mysql()
    pass
    # 關閉數據庫連接
    # db.close()

測試

各個框架小調用get_mysql()查詢mysql
image.png

測試結果Jmeter導出

如下表格 分別對python的幾種框架進行了30QPS、200QPS、800QPS測試
image.png

表頭說明(響應時間的單位均為ms):
樣本:本次場景中一共完成了多少次請求
中位數:也就是說統計50%的用戶響應時間
90%百分位:90%用戶的響應時間
95%百分位:95%用戶的響應時間
troughput:吞吐量、“吐”進去的是請求,“吐”出來的是結果,吞吐率說的是軟件系統的“飯量”,即軟件系統的處理能力,也就是單位時間內軟件系統能夠處理多少數據/事務

結果分析:

對於結果我主要看99%百分位及異常百分比2個數據(我覺得99%百分位能說明框架對與絕大對數請求的響應時間,異常百分比能說明框架的穩定性)
圖中綠色表示最好 黃色次之。

  1. 單從測試來看各個框架其實並沒有量級上的差別(耗時主要發生在sql操作,實際web場景其實也是這樣),
  2. flask果然符合它輕量級的人設,在30QPS這種低並發的場景下表現得最優秀。
    綜合來看aiohttp的性能最好。

PS Vibora運行失敗沒能測試:
Vibora官方說是需要python3.7+環境,但是我本地mac上3.7 3.8都有試過hello world都跑不起來 google了一大圈都沒有解決,最后放棄了
image.png

總結

本次測試可能有點片面,但是也能說明些問題,tornado老牌框架表現不錯,aiohttp這個后起之秀值得關注。
其實選擇一個框架不單單從性能方面考慮,我們還得從它的生態、廣泛度等方面考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM