Django代码性能优化与Pycharm Profile使用详解
作者:mattkang 发布时间:2022-06-28 21:13:06
前言
pycharm是python的一个商业的集成开发工具,本人感觉做python开发还是很好用的,django是一个很流行的python web开源框架,本文将通过实例代码给大家介绍了关于Django代码性能优化与Pycharm Profile使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
是一段导出数据月报的脚本,原先需要十几秒,优化后只需要1秒多。
Pycharm Profile
优化第一步就是Profile,先看看慢在哪里。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秒。
来源:https://blog.csdn.net/handsomekang/article/details/78944705


猜你喜欢
- 前些日子有网友问:将ASP纪录集输出成n列的的表格形式显示的方法?现在写了一个,方便大家使用。'定义变量 Dim cn,r
- 本文实例为大家分享了python3 pygame接小球游戏的具体代码,供大家参考,具体内容如下操作方法:鼠标操作截图:直接放代码:# -*-
- 目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,
- 简介我们都知道计算机是基于二进制的,位运算是计算机的基础运算。位运算的优势很明显,CPU 指令原生支持、速度快。基于位运算的位集合在有限的场
- 前言几乎每个程序都需要用到图片。下面就来给大家介绍前端+PHP后端实现微信小程序实现图片上传功能,分享出来供大家参考学习,下面话不多说了,来
- 一 异常处理1.什么是异常Error(错误)是系统中的错误,程序员是不能改变的和处理的,如系统崩溃,内存空间不足,方法调用栈溢等。遇到这样的
- python爬取数据保存为Json格式代码如下:#encoding:'utf-8'import urllib.request
- 今天使用shuffleNetV2+,使用自己的数据集,遇到了loss是nan的情况,而且top1精确率出现断崖式上升,这显示是不正常的。在网
- 前言Pandas是为一次性处理整个行或列的矢量化操作而设计的,循环遍历每个单元格、行或列并不是它的设计用途。所以,在使用Pandas时,你应
- 本文实例讲述了Python文件去除注释的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/python # -*- cod
- 注意:本文基于Python2.4完成;如果看到不明白的词汇请记得百度谷歌或维基,whatever。 1. 正则表达式基础 1.1. 简单介绍
- Django1.8.2中文文档:Django1.8.2中文文档上传图片配置上传文件保存目录1)新建上传文件保存目录。2)配置上传文件保存目录
- 示例文件将以下内容保存为文件 people.csv。id,姓名,性别,出生日期,出生地,职业,爱好1,张小三,m,1992-10-03,北京
- 图的实现所谓图就是节点及其连接关系的集合。所以可以通过一个一维数组表示节点,外加一个二维数组表示节点之间的关系。//图的矩阵实现typede
- 本文实例讲述了python中dir函数用法。分享给大家供大家参考。具体分析如下:dir 函数返回任意对象的属性和方法列表,包括模块对象、函数
- 阅读上一篇:网马解密大讲堂——网马解密初级篇今天主要讲解的内容是Freshow工具的使用方法,工欲善其事,必先利其器,首先要学会如何使用解密
- 需求手百小程序的toast仅支持在页中展示,不能自定义位置、字体大小、在单个文本中增加icon等需求;因此自定义一个全局可通用的Toast。
- 本文实例为大家分享了python通过实例方法名字调用方法的具体代码,供大家参考,具体内容如下案例: &nb
- [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化,
- 文件的io操作的缓冲行为分为全缓冲:同系统及磁盘块大小有关,n个字节后执行一次写入操作行缓冲:遇到换行符执行一次写操作无缓冲:立刻执行写操作