Python提供了许多用于懒惰求值的工具,尤其是通过 生成器和生成器表达式构造。值得阅读Python的惰性,以发现在代码中使用惰性模式的机会。
Django中的惰性
Django本身很懒。在的评估中可以找到一个很好的例子QuerySets。QuerySet是惰性的。因此,QuerySet可以创建,传递和与其他对象组合使用 QuerySets,而无需实际进行任何数据库访问以获取其描述的项目。传递的是QuerySet对象,而不是数据库最终需要的项目集合。
另一方面,某些操作将强制评估QuerySet。避免过早评估a QuerySet可以节省对数据库的昂贵而不必要的行程。
Django还提供了一个keep_lazy()装饰器。这允许使用惰性参数调用的函数本身表现为惰性,仅在需要时才进行评估。因此,在严格要求之前,不会调用惰性参数(可能是昂贵的参数)进行评估。
数据库
数据库优化
Django的数据库层提供了多种方法来帮助开发人员从其数据库中获得最佳性能。该数据库优化文档汇聚链接到相关文件,并增加了各种技巧,大纲的步骤尝试优化数据库使用情况时服用。
其他与数据库有关的技巧
启用持久连接可以在大部分请求处理时间中加快与数据库帐户的连接。
例如,这对网络性能有限的虚拟主机有很大帮助。
HTTP性能
中间件
Django随附了一些有用的中间件 ,可以帮助您优化网站的性能。它们包括:
ConditionalGetMiddleware
添加了对现代浏览器的支持,以基于ETag和Last-Modified标头有条件地获取响应 。如果需要,它还会计算并设置一个ETag。
GZipMiddleware
压缩所有现代浏览器的响应,节省带宽和传输时间。请注意,当前将GZipMiddleware视为安全风险,并且容易受到使TLS / SSL提供的保护无效的攻击的攻击。有关GZipMiddleware更多信息,请参阅警告。
会话
使用缓存的会话
使用缓存的会话可能是一种通过避免从较慢的存储源(如数据库)中加载会话数据,而将频繁使用的会话数据存储在内存中来提高性能的方法。
静态文件
静态文件(根据定义不是动态的)是实现优化收益的绝佳目标。
ManifestStaticFilesStorage
通过利用Web浏览器的缓存功能,您可以在初始下载后完全消除给定文件的网络命中。
ManifestStaticFilesStorage在静态文件的文件名后附加一个与内容相关的标记,以使浏览器可以安全地长期缓存它们,而不会丢失将来的更改-文件更改时,标记也将更改,因此浏览器将自动重新加载资产。
“缩小”
几个第三方Django工具和软件包提供了“最小化” HTML,CSS和JavaScript的功能。它们删除了不必要的空格,换行符和注释,并缩短了变量名,从而减小了站点发布的文档的大小。
模板性能
注意:
- 使用比使用更快{% block %}{% include %}
- 由许多小块组装而成的严重碎片化的模板会影响性能
缓存的模板加载器
启用通常可以大大提高性能,因为它避免了每次需要渲染每个模板时就对每个模板进行编译。cached template loader
使用不同版本的可用软件
有时值得检查您所使用软件的不同版本和性能更好的版本。
这些技术面向希望突破已经充分优化的Django站点的性能极限的更高级的用户。
但是,它们并不是解决性能问题的灵丹妙药,它们不可能为尚未以正确方式做更多基本工作的网站带来比边缘收益更好的收益。
注意
值得重复一遍:寻找已经使用的软件的替代品永远不是解决性能问题的第一个答案。当达到此优化级别时,您需要一个正式的基准测试解决方案。
更新通常是-但并非总是-更好
新发行的维护良好的软件效率较低的情况相当少见,但是维护人员无法预见所有可能的用例-因此,尽管意识到较新版本的性能可能会更好,但不要以为它们总是将。
Django本身就是这样。后续版本在整个系统上提供了许多改进,但是您仍然应该检查应用程序的实际性能,因为在某些情况下,您可能会发现更改意味着性能较差而不是更好。
较新版本的Python以及Python包也通常会表现更好-但要衡量而不是假设。
注意
除非您在特定版本中遇到不寻常的性能问题,否则通常会在新版本中找到更好的功能,可靠性和安全性,并且这些好处远比您可能会赢得或失去的任何性能都重要。
Django模板语言的替代品
在几乎所有情况下,Django的内置模板语言都足够了。但是,如果Django项目中的瓶颈似乎在模板系统中,而您又花了其他机会来解决此问题,那么第三方替代方法可能是答案。
Jinja2可以提高性能,特别是在速度方面。
替代模板系统在共享Django模板语言的程度上有所不同。
注意:如果您在模板中遇到性能问题,则要做的第一件事就是确切地了解原因。使用备用模板系统可能会证明更快,但是在不造成麻烦的情况下也可以获得相同的收益-例如,可以在视图中更有效地完成模板中的昂贵处理和逻辑。
替代的软件实现
可能值得检查您所使用的Python软件是否已以不同的实现提供,该实现可以更快地执行相同的代码。
但是:在编写良好的Django站点中,大多数性能问题不是在Python执行级别上,而是在效率低下的数据库查询,缓存和模板方面。如果您依赖编写不佳的Python代码,则无法通过更快地执行来解决性能问题。
使用替代实现可能会引入兼容性,部署,可移植性或维护问题。不用说,在采用非标准实现之前,您应确保它为您的应用程序提供了足够的性能提升,从而胜过了潜在的风险。
考虑到这些警告,您应该意识到:
PyPy
PyPy是Python本身的Python实现(“标准” Python实现在C中)。PyPy通常可用于重量级应用程序,因此可显着提高性能。
PyPy项目的主要目标是与现有的Python API和库兼容。Django是兼容的,但您需要检查您依赖的其他库的兼容性。
Python库的C实现
一些Python库也用C实现,并且速度可能更快。他们旨在提供相同的API。请注意,兼容性问题和行为差异并不是未知的(并且并不总是立即可见)。
详情参考: https://docs.djangoproject.com/en/3.0/
标签:Django
相关阅读 >>
更多相关阅读请进入《Django》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。