Django 的性能与优化


本文整理自网络,侵删。

简介

通常一个人首先关心的是编写代码的作品,它的逻辑功能根据需要产生预期的输出。但是,有时这还不足以使代码高效地工作。

在这种情况下,需要的是某种东西-实际上,通常是一系列东西-可以提高代码的性能,而又不会,或者仅以最小的方式影响代码的行为。

一般方法

什么是你最优化的?

清楚了解“性能”的含义很重要。不仅有一个指标。

提高速度可能是程序最明显的目标,但有时可能会寻求其他性能改进,例如降低内存消耗或减少对数据库或网络的需求。

一个方面的改进通常会带来另一方面的改进,但并非总是如此;有时一个人甚至可以牺牲另一个人。例如,程序速度的提高可能会导致它使用更多的内存。更糟糕的是,这可能是自欺欺人的-如果速度提升如此之耗内存,以至于系统开始耗尽内存,那么您的弊大于利。

还有其他需要权衡的方面。您自己的时间是宝贵的资源,比CPU时间更宝贵。有些改进可能太难了,不值得实施,或者可能影响代码的可移植性或可维护性。并非所有的性能改进都值得付出努力。

因此,您需要知道要实现哪些性能改进,并且还需要知道有充分的理由朝着这个方向瞄准-并且您需要:

性能基准测试

仅仅猜测或假设效率低下在代码中是没有用的。

Django工具

django-debug-toolbar是一个非常方便的工具,可以深入了解您的代码在做什么以及花了多少时间。特别是,它可以显示页面生成的所有SQL查询以及每个查询花费了多长时间。

工具栏也可以使用第三方面板,该面板可以(例如)报告缓存性能和模板渲染时间。

第三方服务

有许多免费服务可以从远程HTTP客户端的角度分析和报告站点页面的性能,实际上是在模拟实际用户的体验。

这些无法报告您的代码内部,但可以提供有用的洞察力来了解您网站的整体性能,包括无法在Django环境中充分衡量的方面。示例包括:

  • 雅虎的Yslow
  • Google PageSpeed

还有一些付费服务执行类似的分析,其中包括一些支持Django的服务,这些服务可以与您的代码库集成以更全面地分析其性能。

从一开始就做好事

优化方面的某些工作涉及解决性能缺陷,但是某些工作也可以内置于您要做的事情中,这是您甚至在开始考虑提高性能之前就应该采用的良好实践的一部分。

在这方面,Python是一种出色的语言,因为外观优美且感觉正确的解决方案通常是性能最好的解决方案。与大多数技能一样,学习“看起来正确”的东西需要练习,但是最有用的准则之一是:

在适当的级别上工作

Django提供了许多不同的处理方式,但是仅仅因为可以以某种方式做某事并不意味着这是最合适的方式。例如,您可能会发现您可以在QuerySet,Python或模板中计算相同的东西-集合中的项目数,也许 。

但是,在较低级别而不是较高级别进行此工作几乎总是会更快。在更高的层次上,系统必须通过多层抽象和机器层次来处理对象。

也就是说,数据库通常可以比Python更快地完成任务,而Python可以比模板语言更快地完成任务:

# QuerySet operation on the database
# fast, because that's what databases are good at
my_bicycles.count()

# counting Python objects
# slower, because it requires a database query anyway, and processing
# of the Python objects
len(my_bicycles)

# Django template filter
# slower still, because it will have to count them in Python anyway,
# and because of template language overheads
{{ my_bicycles|length }}

一般而言,最适合该工作的级别是适合编写代码的最低级别。

注意

上面的示例仅是说明性的。

首先,在现实生活中,您需要考虑计数前后发生的事情,以找出在特定情况下执行此操作的最佳方法。数据库优化文档描述了一种情况,在这种情况下,模板中的计数会更好。

其次,还有其他选择要考虑:在实际情况下,直接从模板调用方法可能是最合适的选择。{{ my_bicycles.count }}QuerySet count()

缓存

通常,计算值很昂贵(即耗费资源且速度很慢),因此将值保存到可快速访问的缓存中以备下次使用时会产生巨大的好处。

Django具有完善的缓存框架以及其他较小的缓存功能,这是一项足够重要且功能强大的技术。

该缓存框架

Django的缓存框架通过保存动态内容,因此无需为每个请求进行计算,就为提高性能提供了非常重要的机会。

为了方便起见,Django提供了不同级别的缓存粒度:您可以缓存特定视图的输出,或者仅缓存难以生成的片段,甚至整个站点。

实施缓存不应被视为改善性能不佳的代码的替代方法,因为它的编写质量很差。这是生成性能良好的代码的最后步骤之一,而不是捷径。

cached_property

通常必须多次调用一个类实例的方法。如果该功能很昂贵,那么这样做会很浪费。

使用cached_property装饰器可以保存属性返回的值。下次在该实例上调用该函数时,它将返回保存的值,而不是重新计算它。请注意,这仅适用于将self参数作为唯一参数的方法,并将方法更改为属性。

某些Django组件也具有自己的缓存功能;这些将在下面与那些组件相关的部分中讨论。

了解懒惰

懒惰是对缓存的一种补充策略。缓存通过保存结果来避免重新计算。懒惰会延迟计算,直到真正需要它为止。

惰性允许我们在实例化它们之前,甚至在可能实例化它们之前都引用它们。这有许多用途。

例如,可以在甚至不知道目标语言之前就使用惰性翻译,因为直到真正需要翻译后的字符串(例如在渲染的模板中)时,它才发生。

懒惰也是一种通过首先避免工作来节省精力的方法。就是说,懒惰的一个方面是什么也要做,直到必须要做,因为毕竟可能没有必要。因此,懒惰可能会影响性能,并且相关工作的成本越高,通过懒惰获得的收益就越大。

阅读剩余部分

相关阅读 >>

Django 简介

Django 模板

Django 模型

将mixins与基于类的视图一起使用

部署清单

基于类的视图

Django 使用表单模板

内置基于类的通用视图

错误报告

Django 处理http请求

更多相关阅读请进入《Django》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...