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

2023-11-01

写在前面:

本文的数据涉及到之前遇到过的问题,大概一次 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机器学习群 } 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django/Flask/Tornado三大web框架性能分析 的相关文章

  • 服务器ie安全增强关闭还是显示,如何关掉ie浏览器的增强安全配置

    在 Windows Sever 2012 中打开 IE 浏览器时 IE10 会出现 已启用 Internet Explorer 增强的安全配置 的提示信息 在安全性等级中会设置以 高安全性 如果我想要关闭 Internet Explorer
  • Anaconda系统配置、换源、环境隔离、pycharm环境配置一站式教程

    Anaconda配置一站式教程 欢迎访问我的博客sakura 绘梨衣 1 安装conda 这个下载 除了安装路径 无脑确定就行了 下载网址 Free Download Anaconda 选择安装系统直接下载 最好是不要安装在C盘 反对C盘战
  • Python对excel写入数据操作实例代码(只供参考)

    coding utf8 把buffer中的信息 写入到excel中 并按照要求 构造表格样式 导入readCSV模块 用来获取buffer数据 from readCSV import readCSV from readConfig impo
  • httpclient 工具类

    1 类 package com cainiao manage utils import org apache http HttpEntity import org apache http NameValuePair import org a
  • 类加载 器&反射

    一 类加载器 1 1类加载 1 2类加载器 理解 1 2 1类加载器的作用 1 2 2JVM的类加载机制 1 2 3Java中的内置类加载器 1 2 4ClassLoader 中的两个方法 二 反射 2 1反射的概述 理解 2 2获取Cla
  • 初学maven详细总结

    文章转载自 https www cnblogs com tzyy p 4768859 html 初学maven 简单总结一下学习心得 若有不对的地方 欢迎各位大神给我指正 总结分为6个部分 maven概述 maven安装 maven项目结构
  • Unity 动态修改宏定义

    宏定义可以方便的区分出不同情况下使用的代码 比较经典的就是 UNITY EDITOR 这类 if UNITY EDITOR Debug Log 当前是编辑器环境 else Debug Log 当前不是编辑器环境 endif 开发者同样可以自
  • 微调预训练模型huggingface,transformers

    首先加载Yelp Reviews数据集 from datasets import load dataset dataset load dataset yelp review full dataset train 100 如您现在所知 您需要
  • 怎么让Chrome浏览器支持小于12px的文字?

    Chrome浏览器默认字体大小是16px 每个浏览器默认字体大小可能不一样 0 8 10 8 px div font size 10px span display inline block webkit transform scale 0
  • Numpy数组的序列化和反序列化

    在处理图像数据时 有这么一种需求 图像通常是一个矩阵数据 需要将矩阵数据通过base64编码传输 传输完毕之后解码还原得到原来的矩阵数据 import numpy as np import base64 matrix data 1 2 3
  • python程序设计心得体会感想-python实训心得体会

    技术文档 主体内容 可以认为是页面最想表达的内容总和 对于内容详情页来说 主体内容指从标题开始至正文内容结束 翻页区域也被视为主体内容 文章后的评论 分享 推荐等不视为主体内容 首屏 用户点击搜索结果后进入移动页面 不滑动屏幕即看到的所有内
  • HashMap为什么要使用红黑树

    在JDK1 8之后 Java对HashMap做了改进 在链表长度大于8的时候 将后面的数据存到红黑树中 以加快检索速度 红黑树也是一种平衡二叉树 每个节点有一个储存位表示节点的颜色 可以是红色或者黑色 通过对任意一条从根到叶子的路径上各个节
  • C++编程习惯与编程要点

    假设现在我们要实现一个复数类complex 在类的实现过程中探索良好的编程习惯 Header 头文件 中的防卫式声明 complex h ifndef COMPLEX define COMPLEX class complex endif 防
  • 专利与论文-2:什么是专利?专利的几种类型?

    目录 1 什么是知识产权 2 什么是专利 3 专利的主要类型 1 什么是知识产权 知识产权 是关于人类在社会实践中创造的智力劳动成果的专有权利 各种智力创造比如发明 外观设计 文学和艺术作品 以及在商业中使用的标志 名称 图像 都可被认为是
  • 现在的00后,真是卷死了呀,辞职信已经写好了·····

    谁说00后躺平了 但是有一说一 该卷的还是卷 这不 上个月我们公司来了个00后 工作没两年 跳槽到我们公司起薪22K 都快接近我了 后来才知道人家是个卷王 从早干到晚就差搬张床到工位睡觉了 最近和他聊了一次天 原来这位小老弟家里条件不太好
  • python计算机视觉编程第六章 图像聚类

    图像聚类 图像聚类 什么是聚类 举个简单的例子 给出了左图中的点的数据 对其划分为三类 这个过程就叫做聚类 聚类实际上就是根据数据的特征进行分类 把相似的东西分在一起 难点 聚类是无监督的 如何在无监督的情况下尽可能分出更好的类别来是一个比
  • [管理与领导-63]:IT基层管理者 - 潜技能 - 1 - 职场中的陷阱 - 看清楚职场中的霸凌现象

    目录 前言 1 打击自尊心 2 孤立他人 3 恶意针对 4 当众羞辱 5 持续性否定 前言 职场中 什么样的人都有 害人之心不可有 防人之心不可无 前者教人从善 后者教善人如何保护自己受到 坏人 的伤害 有一种情形 每天上班都陷入抑郁 总是
  • 面向对象练习题-第十三天

    练习1 基础 建立一个学生类 其中成员变量为学号 姓名 及三门课的成绩 数组 另建立一个包含主方法的类 定义2个学生类的对象 1 Student package com hpe java import java util Arrays 建立
  • 【ElementUI】日期选择器时间选择范围限制

    ElementUI 日期选择器时间选择范围限制 根据接口灵活设置可选时间 只能选今天之前的时间 或者是只能选今天之后的时间 今天是否可以选 限制结束日期不能大于开始日期
  • 【计算机操作系统】第八章 网络操作系统

    1 计算机网络概述 ARPA 网 gt Internet 1 1 计算机网络的拓扑结构 1 2 计算机广域网络 计算机网络分为广域网和局域网两类 公用交换电话网 分组交换网 帧中继网 异步传输模式 ATM 1 3 计算机局域网络 基本局域网

随机推荐

  • 华为OD机试 C++ 字符串化繁为简

    描述 给你一串只包含英文字母 无论大写或小写 和小括号的字符 注意 小括号总是成对出现 并且不会互相嵌套 小括号里的英文字母表示它们之间是等价的 比如在 ab 里 a 和 b 是等价的 而在 bc 里 b 和 c 是等价的 因此 a b 和
  • 图像融合算法(像素级)

    图像融合技术可以提取自然光图像和红外图像的互补信息 获得对同一场景描述解释更为准确 全面和可靠的图像 像素级融合是常用于灰度图像与可见光图像的融合 基于源图像的彩色化就是源图像和目标图像的融合过程 使其同时兼有源图像的颜色和目标图像的形状
  • 计算机专业毕设论文题目大全(二)

    这一期为大家整理了计算机专业常见的论文题目 需要参考资料的同学可以直接点击后面链接下载 没有链接的可以添加微信biyezhan007来获取资源 序号 题目 下载链接 101 基于Android的跃动旋律音游app的设计与实现 102 基于A
  • 【开发工具-Guava】新集合类型

    1 概述 转载 新集合类型 Guava引入了很多JDK没有的 但我们发现明显有用的新集合类型 这些新类型是为了和JDK集合框架共存 而没有往JDK集合抽象中硬塞其他概念 作为一般规则 Guava集合非常精准地遵循了JDK接口契约 2 Mul
  • 【学习笔记】深入浅析BIO、NIO、AIO

    BIO NIO AIO Java的I O演进之路 I O模型 就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收 很大程度上决定了程序通信的性能 Java共支持3种网络编程的I O模型 BIO NIO AIO 实际 通行需求下 要
  • electron-vue 使用remote 模块 进行多个子窗口的关闭

    remote 模板在13版本后禁用了 至于我为什么用它 是因为一个功能的原因 多个子窗口可以进行对应的操作事件后单独关闭当前的某一个子窗口 1 先进行下载 npm yarn install save electron remote 2 需要
  • Python 代码执行超时判断

    通过 signal 信号处理函数 import signal 自定义异常类 继承自BaseException 这样Exception就捕获不到 class TimeoutException BaseException pass 超时信号函数
  • PCL 由点云生成深度图像

    前言 在电脑上的pcl1 8 0版本可能是由于版本问题 无法在窗口显示深度图像 但是深度图像确实是生成了的 可以通过一个API将深度图像保存为一个png格式的图片然后查看 该函数如下 save rangeImage 相关的头文件 inclu
  • BDCN论文学习

    1 Dilated Convolutions 图像语义分割最核心的两个地方是用pooling下采样减小图像尺寸增大感受野 另一个是用deconv反卷积上采样增大图像尺寸 是用pooling可以增大感受野但是会带来信息损失 若是不用pooli
  • java正则表达式匹配数字和小数点,快来收藏!

    1 为什么要使用分布式锁 使用分布式锁的目的 无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作 1 1举一个很长的例子 系统 A 是一个电商系统 目前是一台机器部署 系统中有一个用户下订单的接口 但是用户下订单之前一定要去检查一下
  • 扫普通链接二维码打开小程序

    一 启用扫描二维码打开小程序 登录小程序后台 进入 开发 开发设置 扫普通链接二维码打开小程序 启用功能 二 配置流程 二维码规则 指的是放置校验文件的路径 同一个域名可为不同小程序创建不同路径存放校验文件 前缀占用规则 选择占用则其他帐号
  • python的基本语法(命令提示符、赋值、标识符、注释、语法规则、内建函数和python应用领域)

    python交互式命令行提示符 gt gt gt print hello gt gt gt 主要提示符 world 续行符 hello world 次要提示符 表示上一条语句没有结束 python赋值 直接赋值 gt gt gt a 1 连
  • html表单验证数字,iview表单验证数字

    验证输入字符串必须为数字 html js exchangeIntegral required true message 请输入兑换积分 trigger blur type string pattern d message 请输入数字 tri
  • 干货!自动驾驶场景下的多目标追踪与实例分割

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 多目标跟踪和分割 MOTS 需要将视频中给定的类别的物体进行检测 分类 跟踪和像素级分割 在其重要的应用场景自动驾驶中 复杂的路况 市区内密集且相似的车辆和行人 以及对低功耗低延
  • sqli-labs-master第17关

    前言 这一关变化还是挺大的 让我们修改密码 第17关 http 192 168 89 134 sqli labs master Less 17 到这里我们还是毫无头绪 只能看源代码 从源码中可以看到 接收到用户POST的uname和pass
  • python猜数字游戏编程、直到猜对为止显示猜了几次_python编写猜数字小游戏

    python编写猜数字小游戏 本文实例为大家分享了python编写猜数字小游戏的具体代码 供大家参考 具体内容如下 import random secret random randint 1 30 guess 0 tries 0 print
  • QCC300x笔记(9) -- 从一个客户问题说说传统蓝牙的AVRCP

    哈喽大家好 这是该系列博文的第九篇 篇 lt lt 系列博文索引 快速通道 gt gt 写在前面 客户反馈连接苹果手机的蓝牙 播放音乐时 会频繁上报歌词 1 客户使用苹果手机 播放音乐后会频繁上报歌词 一句歌词上报一次 通过ID3事件在AL
  • 更改conda镜像源

    show channel urls true channel alias http mirrors tuna tsinghua edu cn anaconda default channels http mirrors tuna tsing
  • 分布式介绍

    虽然本人在前面也写过好几篇分布式系统相关的文章 主要包括CAP理论 分布式存储与分布式事务 但对于分布式系统 并没有一个跟清晰的概念 分布式系统涉及到很多的技术 理论与协议 很多人也说 分布式系统是 入门容易 深入难 我之前的学习也只算是管
  • Django/Flask/Tornado三大web框架性能分析

    写在前面 本文的数据涉及到之前遇到过的问题 大概一次 http 请求到收到响应需要多少时间 这个问题在实际工作中与框架有比较大的关系 因此特别就框架的性能做了一次分析 这里使用之前的一个报告数据 Python s Web Framework