Django - 使用templatetags渲染许多模板非常慢

las*_*hla 15 django optimization django-templates

说,我有一个带照片库的页面.每个缩略图都有例如照片,国家,作者等.我使用模板标签(加载指定的模板)渲染这些项目/小部件 - 由于DRY(我在页面上的不同位置单独使用这些项目/小部件),它就是这样.

它很慢.

我使用django-debug-toolbar执行了一些分析:

SQL Queries: default 84.81 ms (147 queries)
Run Code Online (Sandbox Code Playgroud)

但:

Total CPU time: 5768.360 msec
Run Code Online (Sandbox Code Playgroud)

等待的时间太长了.

经过一番分析后发现,主要罪魁祸首是模板化.

当我想显示例如150张照片时,通过模板呈现600个相关项目/小部件.这意味着600次I/O操作甚至更多.将这些小部件移动到主模板可以解决问题,但不会保留DRY.

所以我的问题是如何避免这种行为?干,慢,干,快?我宁愿干得快......

las*_*hla 11

经过几个小时的剖析和搜索......

感谢您的帮助,但在这种情况下,在我看来,目前为止最好的解决方案是使用模板片段缓存:

我尝试了它,并获得了70-80%的速度性能!

{% load cache %}
{% cache 3600 mywidget_id %}
    .. rendered mywidget is cached ..
{% endcache %}
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 10

您可能想要尝试缓存模板加载器,django.template.loaders.cached.Loader- 它当然应该减少所需的IO数量.

编辑添加你需要小心假设只是因为大部分时间花在模板渲染阶段,查询计数不应该受到责备.不要忘记查询集是惰性的,除非您在视图中专门切片或迭代它们,否则只会在加载模板时对它们进行求值.我会说通过良好的使用select_related和其他技术减少您的查询计数应该是重要的帮助.