Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么django模板呈现字典的速度如此之慢?_Python_Django_Django Templates_Django Views_Jinja2 - Fatal编程技术网

Python 为什么django模板呈现字典的速度如此之慢?

Python 为什么django模板呈现字典的速度如此之慢?,python,django,django-templates,django-views,jinja2,Python,Django,Django Templates,Django Views,Jinja2,当我使用django 1.4的默认模板系统渲染一个中等复杂的字典(4层深,约2K个数据点)时,模板渲染步骤需要2800ms以上的时间。当我直接从python生成html gen时,需要大约80毫秒。即使使用另一个模板库()也会在300毫秒内呈现相同的数据(事实上,几乎完全相同的模板语法-因为jinja2几乎是替代品) 有趣的是,在django的模板系统中,您甚至不需要在模板中实际呈现字典就可以导致此性能问题。。。您所要做的就是将其作为可用变量传递给模板。我的一位朋友建议,这可能意味着该系统“正在

当我使用django 1.4的默认模板系统渲染一个中等复杂的字典(4层深,约2K个数据点)时,模板渲染步骤需要2800ms以上的时间。当我直接从python生成html gen时,需要大约80毫秒。即使使用另一个模板库()也会在300毫秒内呈现相同的数据(事实上,几乎完全相同的模板语法-因为jinja2几乎是替代品)

有趣的是,在django的模板系统中,您甚至不需要在模板中实际呈现字典就可以导致此性能问题。。。您所要做的就是将其作为可用变量传递给模板。我的一位朋友建议,这可能意味着该系统“正在进行防御复制或(更愚蠢的)理解,由于运行构造函数,这需要时间”

有人知道为什么django的默认模板系统需要如此长的时间来呈现字典吗

*我将在下面添加请求的详细信息*

我正在调试模式下运行,并将DebugToolBar中间件设置为我的中间件类之一。My 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
    })
)

如果您能向我们提供您的模板代码,以便更好地了解我们正在处理的是哪种模板处理,那就太好了

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

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


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

为什么你不运行cProfile服务器而不是我们猜测?我们没有你的数据。你有什么奇特的上下文处理器吗?你能提供一个具有虚拟数据的可运行示例吗?这并不能回答你的问题,但值得一看:。@PavelAnossov+一个简短的回答?因为这是我第一次听说cProfile:)我将继续研究并发布更新。可能需要一些时间,因为我正在赶最后期限工作,并且能够使用jinja2避开这个问题,转而处理其他问题。我只是好奇这是否是一个由更有经验的人知道的问题。但是你说得很好,它很可能是我的设置所特有的。Jinja2的性能比Django模板好得多。谢谢你发布这篇文章。我没有时间更新我的问题,这让我很难受。当我这样做的时候,我计划用一个非常简单的例子来重现这种行为。在测试中,我尝试了items()和iteritems()。我非常担心我在模板中引用字典的方式会导致问题。这就是为什么我测试用“hello world”模板替换。理解这一点很重要,因为这对渲染时间几乎没有影响。出于这个原因,我很确定这种迟钝与实际渲染无关。