Django/Flask/Tornado三大web框架性能分析

寫在前面:

本文的數據涉及到之前遇到過的問題,大概一次 http 請求到收到響應需要多少時間。這個問題在實際工作中與框架有比較大的關系,因此特別就框架的性能做了一次分析。

這里使用之前的一個報告數據: Python's Web Framework Benchmarks。本文僅關注目前最常用的三大 Python 框架:Django、 Flask 以及 Tornado。

報告主要比較三點:

  • JSON:序列化一個對象,并返回一個 json。

  • 遠程性能:從遠程服務器上返回 http response 的時間

  • 數據庫性能:使用 ORM(對象關系映射)從數據庫獲取數據,并渲染到模板上的時間

最基本的 json 測試:Django 與 Flask 占優

單純在本地測試 json 的序列化,Django 完成一次 json 序列化的平均時間 42.52 毫秒,每秒請求量 4762 次。Flask 在此項測試中,與 Django 的比較不相上下,Flask 平均時間 43.33 毫秒,每秒請求量 4630 次。Tornado 完成 json 序列化的平均時間高達 77.51 毫秒,是所有框架中耗時最長的,每秒請求數是 2578 次,也是低于 Django 與 Flask 的水準。這僅僅說明框架在本地處理 json 的速度。框架還涉及 http request/response 以及數據庫的讀寫,后面還需要綜合來分析框架的性能。

640?wx_fmt=png
640?wx_fmt=png

處理遠程 http 請求的能力:Tornado 占絕對優勢

從這項測試開始,Tornado 的強悍開始顯現。Tornado 完成 http 請求的平均時間是 1.04 秒,而 Flask 是 3.34 秒,Django 是 3.48 秒,http 響應速度 Tornado 比 Flask 以及 Django 快三倍。

值得注意是,如果綜合考慮 http 相應速度以及json 處理速度,如果把兩項指標的平均時間相加:Tornado 耗時 1114.48 毫秒,Flask 是 3387.60 毫秒,Django 是 3519.88 毫秒。

Tornado 的好成績得益于其自帶的異步特性,而 Django 與 Flask 是同步框架,在處理請求時性能受限。但是實際使用中,一般是Django/Flask + Celery + Redis/Memchaned/RabbitMQ 的模式,由此帶上了異步處理的能力。

640?wx_fmt=png
640?wx_fmt=png

數據庫與模板處理性能:Tornado 與 Flask 旗鼓相當

Django 飽受詬病的地方就是 Django ORM 確實很慢,加上模板處理時間,Django 的平均時間 2904.04 毫秒,每秒處理請求量 42.9 次。然而 Django 的大部分功能是建立在其 Django ORM 基礎上,比如 models, admin, forms 甚至第三方框架 django-rest-framework。Django 的開發效率與維護非常棒,然而 Django ORM 深度綁定了該框架,如果你需要把 Django ORM 換成其它輪子,那么也意味著 Django 的諸多優秀特性將從此告別。

Flask 事實上的 ORM 是 SQLAlchemy,SQLAlchemy 比 MySQLdb 的耗時多 5% 左右,所以是性能相當不錯的數據庫 ORM。得益于 SQLAlchemy 的優異性能,Flask 的每秒處理請求數為 123 次,平均處理時間 1440.24 秒,與 Tornado 性能相當。

Tornado 的每秒處理請求數為 143 次,平均處理時間 1344.69 秒。對于數據庫與模板的處理,Tornado 與 Flask 不相上下。

640?wx_fmt=png
640?wx_fmt=jpeg

結論

  • Django:Python 界最全能的 web 開發框架,battery-include 各種功能完備,可維護性和開發速度一級棒。常有人說 Django 慢,其實主要慢在 Django ORM 與數據庫的交互上,所以是否選用 Django,取決于項目對數據庫交互的要求以及各種優化。而對于 Django 的同步特性導致吞吐量小的問題,其實可以通過 Celery 等解決,倒不是一個根本問題。Django 的項目代表:Instagram,Guardian。

  • Tornado:天生異步,性能強悍是 Tornado 的名片,然而 Tornado 相比 Django 是較為原始的框架,諸多內容需要自己去處理。當然,隨著項目越來越大,框架能夠提供的功能占比越來越小,更多的內容需要團隊自己去實現,而大項目往往需要性能的保證,這時候 Tornado 就是比較好的選擇。Tornado項目代表:知乎。

  • Flask:微框架的典范,號稱 Python 代碼寫得最好的項目之一。Flask 的靈活性,也是雙刃劍:能用好 Flask 的,可以做成 Pinterest,用不好就是災難(顯然對任何框架都是這樣)。Flask 雖然是微框架,但是也可以做成規模化的 Flask。加上 Flask 可以自由選擇自己的數據庫交互組件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等異步特性以后,Flask 的性能相對 Tornado 也不逞多讓,也許Flask 的靈活性可能是某些團隊更需要的。

總結,蘿卜白菜各有所愛,然而機器的效率(程序的性能)與程序員的效率(可維護性、開發速度)是一對矛盾。選擇什么樣的架構組合,取決于產品的特性以及團隊的能力。

∞∞∞∞∞



640?wx_fmt=jpeg&wx_lazy=1

IT派 - {技術青年圈}持續關注互聯網、區塊鏈、人工智能領域640?wx_fmt=jpeg&wx_lazy=1



公眾號回復“機器學習”,

邀你加入{ IT派AI機器學習群 }?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python urllib模塊學習筆記

這個模塊是最基本最常用的,以前看過,總結一下 #coding : utf-8import urlliburl http://cnblogs.com#代理服務器proxies {http:http://127.0.0.1:8087}#使用代理服務器打開r urllib.urlopen(url,proxies proxies)print r.info()print r.getcode()pri…

hibernate基礎工具findBySQL學習

public List<Map<String,Object>> findBySQL(String sql,Map<String,Object> param,int start,int max) {log.debug("finding List by hql");try {       //最后返回map map的key可為別名和數據庫字段SQLQuery querysessionFactory.getCurr…

python處理ini文件_python對ini配置文件處理

>>> cf.read("test.ini") #讀取配置文件[test.ini]>>> cf.sections() #片段名[base, callback]>>> cf.options("callback") #配置…

Python實現自動推本地github博客到遠程倉庫

Python實現自動推本地github博客到遠程倉庫 以前的簡單版本 通過python中的os模塊操作系統命令 詳情可參考:Python實現一行代碼推本地git到遠程倉庫 升級版本 本次加入了監聽文件修改功能 這樣腳本只需在后臺運行,即可檢測到對應的文件夾中的內容是否變化 如果變化,則調用…

H.264/MPEG-4 AVC

維基百科&#xff0c;自由的百科全書跳轉到&#xff1a; 導航, 搜索 跳過字詞轉換說明 漢漢▼▲為了閱讀方便&#xff0c;本文使用全文手工轉換。轉換內容&#xff1a;本文采用電腦和信息技術組全文轉換 [查看] ? [編輯] ? [強制刷新] 以下為本條目單獨的全文轉換&#xff0c…

JavaScript 專題之函數柯里化

JavaScript 專題系列第十三篇&#xff0c;講解函數柯里化以及如何實現一個 curry 函數 定義 維基百科中對柯里化 (Currying) 的定義為&#xff1a; In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes m…

機器學習模板

根據心情補充&#xff0c;語言都是Python hash&#xff0c;把所有的文本轉化成數字 from sklearn.preprocessing import LabelEncoder for c in train.columns:if train[c].dtype object:lbl LabelEncoder()lbl.fit(list(train[c].values) list(test[c].values))train[c] l…

漂亮特殊字體可復制_12個創意字體免費下載網站

今天為大家介紹12個創意字體的網站&#xff0c;這些網站都有提供免費下載的字體哦&#xff0c;希望對大家在創作上面有所幫助。FontSpace在Fontspace上有超過42000種免費字體。在這里字體被整齊的分門歸類&#xff0c;幫助你找到想要的字體。除了典型的“serif” “script”等&…

使用postman測試接口

Postman是一款功能強大的網頁調試與發送網頁HTTP請求的Chrome插件。在java web開發中使用非常多&#xff0c;經常用來測試接口。 使用postman模擬json數據的發送 第一步:在header里邊設置發送數據的類型 Paste_Image.png設置發送數據類型為json&#xff0c;也就是key為Content-…

刪除github上的commit歷史記錄

刪除github上的commit歷史記錄 起步 今天小編發現了git克隆下來的遠程庫特別大: 經過查詢之后發現是每次推送之后都會留下記錄緩存&#xff0c;這樣很多沒用的記錄就會占用多余的空間&#xff0c;別人克隆的時候也會多耗費時間&#xff0c;今天我查到了一個清除無用記錄的方…

DirectShow組件原理分析及應用

1 DirectX簡介  DirectX是Microsoft公司為游戲和其他高性能多媒體應用所提供的一套底層應用程序編程接口。這些接口包括對二維和三維圖形&#xff0c;聲效和音樂&#xff0c;輸入設備以及多玩家網絡游戲等的支持。目前DirectX的最高版本是DirectX 9.0。  1.1 DirectX的組成…

接口安全

老大發了篇文章&#xff0c;讓看如何寫出安全的接口。 如何寫出安全的API接口&#xff1f;接口參數加密簽名設計思路轉載于:https://www.cnblogs.com/Tpf386/p/7053795.html

python中xml模塊_python學習第十五天-2(XML模塊)

也是一種文本轉換形式。importxxxxxxxxxxxxxxxxxxx asxx,可以用xx代替xxxxxxxxxxxxxxxxxxx模塊xml文件的新增&#xff0c;修改&#xff0c;刪除&#xff0c;查詢。新增&#xff1a;?import xml.etree.ElementTreeas ET?new_xmlET.Element(nameList)#創建xml的根節點相當于na…

ubuntu系統下Java環境JDK的安裝

Debian Linux下安裝jdk 下載壓縮包 官網下載對應的.gz包 點擊下載 解壓文件 創建一個目錄用于存放解壓后的文件&#xff0c;并解壓縮到該目錄下 sudo mkdir /opt/java8 sudo tar -zxvf jdk-8u221-linux-x64.tar.gz -C /opt/java8修改環境變量 sudo vim ~/.bashrc 進入…

棧溢出筆記1.3 準備Shellcode

經過1.1和1.2節的講述&#xff0c;我們已經知道了怎樣更改EIP的值。程序運行函數之后將跳轉到我們設定的位置開始運行&#xff0c;因此&#xff0c;我們須要準備一個自己的程序&#xff0c;接手后面的工作。這是一個什么樣的程序&#xff1f;是一個C語言編寫的代碼&#xff1f;…

DirectShow開發快速入門之慨述

文章來源&#xff1a;http://tech.163.com/school 2005-08-18 10:21:32 來源: 天極網摘要&#xff1a;本篇文檔概括性的介紹了DirectShow的主要組成部分&#xff0c;以及一些Directshow的基本概念。熟悉這些基本的知識對于Directshow的應用開發或者過濾器的開發者都會有所幫助…

Android selector中的item的順序

在selector中&#xff0c;要將默認狀態的item放在最后面&#xff0c;因為一旦前面的item滿足匹配條件&#xff0c;后面的item就不會去匹配。因此&#xff0c;把默認狀態的item放在前面的話&#xff0c;后面的item沒有執行的機會轉載于:https://www.cnblogs.com/xiaoyuersdch/p/…

權限表使用聯合主鍵嗎_天天寫 order by,你知道Mysql底層執行流程嗎?

前言 在實際的開發中一定會碰到根據某個字段進行排序后來顯示結果的需求&#xff0c;但是你真的理解order by在 Mysql 底層是如何執行的嗎&#xff1f;假設你要查詢城市是蘇州的所有人名字&#xff0c;并且按照姓名進行排序返回前 1000 個人的姓名、年齡&#xff0c;這條 sql 語…

nodejs簡介

nodejs是啥&#xff1f; Node.js是運行在服務端的JavaScript。 Node.js是一個基于Chrome JavaScript運行時建立的一個平臺。 Node.js是一個事件驅動I/O服務端JavaScript環境&#xff0c;基于Google的V8引擎&#xff0c;V8引擎執行Javascript的速度非常快&#xff0c;性能非常…

jumpserver v0.4.0 基于 CenOS7 的安裝詳解

標簽&#xff08;linux&#xff09;&#xff1a; jumpserver 筆者Q:972581034 交流群&#xff1a;605799367。有任何疑問可與筆者或加群交流 首首先使用Jumpserver前要理解清楚這三個用戶關系: 1.用戶&#xff1a; 是指你在web上創建的用戶,會在跳板機上創建這個用戶,作用就是用…