慢是相对的。同样是人,有的人跑得快,有的人跑得慢。如果你的Python程序或Django项目运行速度慢,先别急着怪Python或Django。其实程序运行效率是可以通过提升硬件水平、架构和数据库优化和改进算法来大大提升的。今天大江哥将分享一些主要Django性能优化手段,完全可以让你的Django程序跑得飞快。本文建议先收藏再阅读,首发于大江狗技术博客Django性能优化大全(https://pythondjango.cn/django/advanced-tutorials), 点击阅读原文即可跳转。
友情提示:
过度性能优化是没有必要甚至有害的,因为花大力气带来的毫秒级的响应提升你的用户可能根本感知不到,毕竟开发人员的时间也很宝贵。
性能优化指标
在对一个Web项目进行性能优化时,我们通常需要评价多个指标:
响应时间
最大并发连接数
代码的行数
函数调用次数
内存占用情况
CPU占比
其中响应时间(服务器从接收用户请求,处理该请求并返回结果所需的总的时间)通常是最重要的指标,因为过长的响应时间会让用户厌倦等待,转投其它网站或APP。当你的用户数量变得非常庞大,如何提高最大并发连接数,减少内存消耗也将变得非常重要。
在开发环境中,我们一般建议使用django-debug-toolbar
和django-silk
来进行性能监测分析。它们提供了每次用户请求的响应时间,并告诉你程序执行过程哪个环节(比如SQL查询)最消耗时间。
对于中大型网站或Web APP而言,最影响网站性能的就是数据库查询部分了。一是反复从数据库读写数据很消耗时间和计算资源,二是当返回的查询数据集queryset非常大时还会占据很多内存。我们先从这部分优化做起。
数据库查询优化
利用Queryset的惰性和缓存,避免重复查询
充分利用Django的QuerySet的惰性和自带缓存特性,可以帮助我们减少数据库查询次数。比如下例中例1比例2要好。因为在你打印文章标题后,Django不仅执行了数据库查询,还把查询到的article_list
放在了缓存里,下次可以在其它地方复用,而例2就不行了。
# 例1: 利用了缓存特性 - Good
article_list = Article.objects.filter(title__contains="django")
for article in article_list:
print(article.title)
# 例2: Bad
for article in Article.objects.filter(title__contains=