当我使用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',
)
和....
# rendering like this
return render(
request,
template_name='ltm/search_results.html',
context_instance=RequestContext(request, {
'menus': menus,
'results': result_dict
})
)
答案 0 :(得分:2)
如果您可以向我们提供您的模板代码,以便更好地了解我们正在处理的模板处理类型,那将会很棒。
首先,您遍历字典内容的方式存在潜在差异。 dict.items()
返回一个元组列表,这些元组消耗额外的内存并花费时间进行初始构建,但如果使用dict.iteritems()
,则访问键和值比通过生成器更快。
当您传入以点.
开头的变量名称时,还会涉及一些开销,例如foo.bar.baz
,其中Django的模板执行所谓的variable lookup,试图确定您是按键访问字典项,对象的属性还是索引列表项。我没有使用过Jinja2,所以变量查找的问题可能完全不相关,但如果两者之间存在差异,那么值得考虑。
在任何一种情况下,由于您处理的是一个相当大的字典,如果您可以在视图中重新组织它的结构,以简化以后在模板中访问数据的方式,这可能会有所帮助。