是一段导出数据月报的脚本,原先需要十几秒,优化后只需要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表.当我们