新聞中心
本文的數(shù)據(jù)涉及到之前遇到過的問題,大概一次 http 請(qǐng)求到收到響應(yīng)需要多少時(shí)間。這個(gè)問題在實(shí)際工作中與框架有比較大的關(guān)系,因此特別就框架的性能做了一次分析。

創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗(yàn),為客戶提供超值的營(yíng)銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營(yíng)銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個(gè)人等客戶提供了網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)服務(wù),以良好的商業(yè)信譽(yù),完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
這里使用之前的一個(gè)報(bào)告數(shù)據(jù): Python's Web Framework Benchmarks。本文僅關(guān)注目前最常用的三大 Python 框架:Django、 Flask 以及 Tornado。
報(bào)告主要比較三點(diǎn):
- JSON:序列化一個(gè)對(duì)象,并返回一個(gè) json。
- 遠(yuǎn)程性能:從遠(yuǎn)程服務(wù)器上返回 http response 的時(shí)間
- 數(shù)據(jù)庫(kù)性能:使用 ORM(對(duì)象關(guān)系映射)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù),并渲染到模板上的時(shí)間
最基本的 json 測(cè)試:Django 與 Flask 占優(yōu)
單純?cè)诒镜販y(cè)試 json 的序列化,Django 完成一次 json 序列化的平均時(shí)間 42.52 毫秒,每秒請(qǐng)求量 4762 次。
Flask 在此項(xiàng)測(cè)試中,與 Django 的比較不相上下,F(xiàn)lask 平均時(shí)間 43.33 毫秒,每秒請(qǐng)求量 4630 次。
Tornado 完成 json 序列化的平均時(shí)間高達(dá) 77.51 毫秒,是所有框架中耗時(shí)最長(zhǎng)的,每秒請(qǐng)求數(shù)是 2578 次,也是低于 Django 與 Flask 的水準(zhǔn)。
這僅僅說明框架在本地處理 json 的速度??蚣苓€涉及 http request/response 以及數(shù)據(jù)庫(kù)的讀寫,后面還需要綜合來分析框架的性能。
處理遠(yuǎn)程 http 請(qǐng)求的能力:Tornado 占絕對(duì)優(yōu)勢(shì)
從這項(xiàng)測(cè)試開始,Tornado 的強(qiáng)悍開始顯現(xiàn)。Tornado 完成 http 請(qǐng)求的平均時(shí)間是 1.04 秒,而 Flask 是 3.34 秒,Django 是 3.48 秒,http 響應(yīng)速度 Tornado 比 Flask 以及 Django 快三倍。
值得注意是,如果綜合考慮 http 相應(yīng)速度以及json 處理速度,如果把兩項(xiàng)指標(biāo)的平均時(shí)間相加:Tornado 耗時(shí) 1114.48 毫秒,F(xiàn)lask 是 3387.60 毫秒,Django 是 3519.88 毫秒。
Tornado 的好成績(jī)得益于其自帶的異步特性,而 Django 與 Flask 是同步框架,在處理請(qǐng)求時(shí)性能受限。但是實(shí)際使用中,一般是Django/Flask + Celery + Redis/Memchaned/RabbitMQ 的模式,由此帶上了異步處理的能力。
數(shù)據(jù)庫(kù)與模板處理性能:Tornado 與 Flask 旗鼓相當(dāng)
Django 飽受詬病的地方就是 Django ORM 確實(shí)很慢,加上模板處理時(shí)間,Django 的平均時(shí)間 2904.04 毫秒,每秒處理請(qǐng)求量 42.9 次。
然而 Django 的大部分功能是建立在其 Django ORM 基礎(chǔ)上,比如 models, admin, forms 甚至第三方框架 django-rest-framework。
Django 的開發(fā)效率與維護(hù)非常棒,然而 Django ORM 深度綁定了該框架,如果你需要把 Django ORM 換成其它輪子,那么也意味著 Django 的諸多優(yōu)秀特性將從此告別。
Flask 事實(shí)上的 ORM 是 SQLAlchemy,SQLAlchemy 比 MySQLdb 的耗時(shí)多 5% 左右,所以是性能相當(dāng)不錯(cuò)的數(shù)據(jù)庫(kù) ORM。得益于 SQLAlchemy 的優(yōu)異性能,F(xiàn)lask 的每秒處理請(qǐng)求數(shù)為 123 次,平均處理時(shí)間 1440.24 秒,與 Tornado 性能相當(dāng)。
Tornado 的每秒處理請(qǐng)求數(shù)為 143 次,平均處理時(shí)間 1344.69 秒。對(duì)于數(shù)據(jù)庫(kù)與模板的處理,Tornado 與 Flask 不相上下。
結(jié)論
Django:Python 界最全能的 web 開發(fā)框架,battery-include 各種功能完備,可維護(hù)性和開發(fā)速度一級(jí)棒。常有人說 Django 慢,其實(shí)主要慢在 Django ORM 與數(shù)據(jù)庫(kù)的交互上,所以是否選用 Django,取決于項(xiàng)目對(duì)數(shù)據(jù)庫(kù)交互的要求以及各種優(yōu)化。而對(duì)于 Django 的同步特性導(dǎo)致吞吐量小的問題,其實(shí)可以通過 Celery 等解決,倒不是一個(gè)根本問題。Django 的項(xiàng)目代表:Instagram,Guardian。
Tornado:天生異步,性能強(qiáng)悍是 Tornado 的名片,然而 Tornado 相比 Django 是較為原始的框架,諸多內(nèi)容需要自己去處理。當(dāng)然,隨著項(xiàng)目越來越大,框架能夠提供的功能占比越來越小,更多的內(nèi)容需要團(tuán)隊(duì)自己去實(shí)現(xiàn),而大項(xiàng)目往往需要性能的保證,這時(shí)候 Tornado 就是比較好的選擇。Tornado項(xiàng)目代表:知乎。
Flask:微框架的典范,號(hào)稱 Python 代碼寫得最好的項(xiàng)目之一。Flask 的靈活性,也是雙刃劍:能用好 Flask 的,可以做成 Pinterest,用不好就是災(zāi)難(顯然對(duì)任何框架都是這樣)。Flask 雖然是微框架,但是也可以做成規(guī)?;?Flask。加上 Flask 可以自由選擇自己的數(shù)據(jù)庫(kù)交互組件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等異步特性以后,F(xiàn)lask 的性能相對(duì) Tornado 也不逞多讓,也許Flask 的靈活性可能是某些團(tuán)隊(duì)更需要的。
總結(jié):蘿卜白菜各有所愛,然而機(jī)器的效率(程序的性能)與程序員的效率(可維護(hù)性、開發(fā)速度)是一對(duì)矛盾。選擇什么樣的架構(gòu)組合,取決于產(chǎn)品的特性以及團(tuán)隊(duì)的能力。
新聞標(biāo)題:Python的三大Web框架性能分析
路徑分享:http://fisionsoft.com.cn/article/djghcss.html
其他資訊
- 創(chuàng)新互聯(lián)Python教程:python日志庫(kù)的模塊化方法
- 全面認(rèn)識(shí)UML類圖關(guān)系
- win10怎么看藍(lán)屏?(windows10看視頻藍(lán)屏)
- VMwareWorkstation一款功能強(qiáng)大的桌面虛擬計(jì)算機(jī)軟件,支持3D圖形,并允許用戶在單臺(tái)計(jì)算機(jī)上創(chuàng)建大量虛擬機(jī),還提供虛擬網(wǎng)絡(luò)上多臺(tái)計(jì)算機(jī)之間的通信。VMware軟件需要序列號(hào)來激活安裝,
- Linux下如何新建SVN庫(kù)(linuxsvn新建庫(kù))


咨詢
建站咨詢
