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

结论

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfzfp.html