为什么django模板如此缓慢地呈现字典?

cod*_*key 9 python django django-templates jinja2 django-views

当我使用django 1.4的默认模板系统渲染中等复杂的字典(4级深度,~2K数据点)时,模板渲染步骤需要2800ms.当我直接从python做html-gen时,需要大约80ms.即使使用另一个模板库(jinja2),在300毫秒内渲染相同的数据(实际上,几乎完全相同的模板语法 - 就像jinja2几乎是一个替代品).

有趣的是,您甚至不必在模板中实际渲染字典以在django的模板系统中导致此性能问题...您所要做的就是其作为可用变量传递给模板.我的一个朋友建议这可能意味着系统是"......做一个防御性的副本或(更愚蠢地)一个理解[由于运行构造函数需要时间"

任何人都知道为什么django的默认模板系统需要很长时间来呈现字典?

*我将努力在下面添加所要求的详细信息*

我在调试模式下运行并将DebugToolbarMiddleware设置为我的中间件类之一.我的settings.py文件包括:

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)
Run Code Online (Sandbox Code Playgroud)

和....

# rendering like this
return render(
    request,
    template_name='ltm/search_results.html',
    context_instance=RequestContext(request, {
        'menus': menus,
        'results': result_dict
    })
)
Run Code Online (Sandbox Code Playgroud)

Fil*_*vić 2

如果您能为我们提供您的模板代码,以便更好地了解我们正在处理的模板处理类型,那就太好了。

首先,您遍历字典内容的方式之间存在潜在的差异。dict.items()返回一个元组列表,该列表会消耗额外的内存并需要时间来初始构造,但如果您使用 ,则访问键和值比通过生成器更快dict.iteritems()

当您传入前面带有点的变量名称时,还会涉及一些开销.,例如foo.bar.baz,Django 的模板执行所谓的变量查找,尝试确定您是通过键访问字典项、对象的属性还是通过索引访问列表项。我没有使用过 Jinja2,因此变量查找的问题可能完全无关,但如果两者之间存在差异,则值得考虑。

在任何一种情况下,由于您处理的是相当大的字典,因此如果您可以在视图中重新组织它的结构以简化稍后在模板中访问数据的方式,可能会有所帮助。