Django代码性能优化与Pycharm Profile使用详解


Posted in Python onAugust 26, 2018

前言

pycharm是python的一个商业的集成开发工具,本人感觉做python开发还是很好用的,django是一个很流行的python web开源框架,本文将通过实例代码给大家介绍了关于Django代码性能优化与Pycharm Profile使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

是一段导出数据月报的脚本,原先需要十几秒,优化后只需要1秒多。

Pycharm Profile

优化第一步就是Profile,先看看慢在哪里。Pycharm自带Profile工具,很方便。
拿一张官方图说明一下。

Django代码性能优化与Pycharm Profile使用详解

图表说明:

  • 给出了函数调用关系。
  • 红色->黄绿色->绿色,颜色越深说明耗时越多。
  • 右上角的“x数字”代表函数调用次数。
  • Own代表该函数本身的耗时,不包括调用子函数;而Total包括调用子函数的耗时。还给出了耗时的百分比。
  • 可以右键“jump to source”,跳到对应的源码。

有了Profile,剩下的事情就好办了。

首先,看到了有个工具函数调用了9千多次,这个函数用到了nametupled,花了很多时间,于是把nametupled去掉,节省了好几秒的时间。

开启Django logger并设置DEBUG级别

继续Profile,看到时间主要在ORM查询数据库那里。
这时,开启Django本身的logger,级别调到DEBUG,这样就会打印出查询的SQL语句。

N+1问题

首先意识到的是ORM查询的N+1问题。

比如有个Order表,里面有个外键user_id是关联User表.当我们

for order in Order.objects.all():
 order.user.id

的时候,Order.objects.all()只有1条sql语句,获取Order表本身的字段到内存,而不会将关联的外键也获取。

当我们order.user_id的时候,不会触发额外的sql查询,而order.user.id的时候,会额外查询User表。

for循环执行了N次,就额外sql查询了N次。故叫N+1问题。

解决N+1的方法:

  • 如果是只用到id字段,则可以直接用user_id代替user.id
  • select_related。将相关的表也一同查询。select_related如果不传参数,表示查询所有外键的表。

又节省了几秒的时间。

只查询需要的字段

继续看log,发现sql查询次数是减少了很多,然而sql查询语句很长,看来是把所有字段都查询出来。

然而我很多时候只需要某几个字段而已,这样全查出来就浪费了。

解决方法:

  • only()。只查询想要的字段。比如Order.objects.only(‘user_id', ‘pay_date', ‘price')
  • annotate()。 可指定虚拟字段,如果外键关联的表只用到小部分字段,可以直接annotate过来。比如将User表的realname字段赋给Order表叫user_realname虚拟字段.这样就不需要order.user.realname查询,只需要order.user_realname来查询,不用select_related把user表全部字段给取出来。Order.objects.annotate(user_realname=F(‘user__realname'))。注意还用到了F(),表示纯数据库层面的操作,不需要拉到python内存进行处理。

An F() object represents the value of a model field or annotated column. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory.

至此,将整段代码的执行时间减少到了1.5秒。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
用Python代码来解图片迷宫的方法整理
Apr 02 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python机器学习之决策树算法
Dec 22 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
Pytorch Tensor 输出为txt和mat格式方式
Jan 03 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
django利用request id便于定位及给日志加上request_id
Aug 26 #Python
python如何创建TCP服务端和客户端
Aug 26 #Python
Django压缩静态文件的实现方法详析
Aug 26 #Python
Python实现将Excel转换成xml的方法示例
Aug 25 #Python
Python实现的简单计算器功能详解
Aug 25 #Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 #Python
Python使用matplotlib绘制三维图形示例
Aug 25 #Python
You might like
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
canvas绘制七巧板
2017/02/03 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
node后端服务保活的实现
2019/11/10 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python中作用域的深入讲解
2018/12/10 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python 内置函数汇总详解
2019/09/16 Python
基于python中__add__函数的用法
2019/11/25 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
Python通过format函数格式化显示值
2020/10/17 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
教研活动总结
2014/04/28 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
小学生通知书评语
2014/12/31 职场文书
2015年酒店工作总结
2015/04/28 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL