前言
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秒。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]