Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 如何配置Jinja2模板?_Python_Flask_Profiling_Jinja2 - Fatal编程技术网

Python 如何配置Jinja2模板?

Python 如何配置Jinja2模板?,python,flask,profiling,jinja2,Python,Flask,Profiling,Jinja2,我正在评测的Flask应用程序花了很长时间渲染其Jinja2模板 我已经安装了一个有趣的工具,但不幸的是,它并没有让我深入到模板渲染中去查看所有时间都花在了哪里 分析Jinja2模板的最佳方法是什么?好问题。通常情况下,我不太需要剖析器,所以这是一个学习的好借口。下面的例子是:我编写了一个简单的分析jinja模板的示例 import cProfile as profile import pstats import StringIO import jinja2 import time pr =

我正在评测的Flask应用程序花了很长时间渲染其Jinja2模板

我已经安装了一个有趣的工具,但不幸的是,它并没有让我深入到模板渲染中去查看所有时间都花在了哪里


分析Jinja2模板的最佳方法是什么?

好问题。通常情况下,我不太需要剖析器,所以这是一个学习的好借口。下面的例子是:我编写了一个简单的分析jinja模板的示例

import cProfile as profile
import pstats
import StringIO

import jinja2
import time

pr = profile.Profile()

def slow():
    time.sleep(2)
    return "Booga!"

template = jinja2.Template(r'''
    {% for i in RANGE1 %}<h1>hello world {{ i}}</h1>{% endfor %}
    {% for i in RANGE2 %}<h1>foo bar {{ i}}</h1>{% endfor %}
    {{ SLOW() }}
        '''
        )

# here is the bit we want to profile
pr.enable()
context = {"RANGE1": range(1000000), "RANGE2":range(100), "SLOW":slow}
template.render(context)
pr.disable()


s = StringIO.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats("cumulative")
ps.print_stats()
print(s.getvalue())
将cProfile导入为配置文件
输入pstats
导入StringIO
进口金玉2
导入时间
pr=profile.profile()
def slow():
时间。睡眠(2)
返回“Booga!”
模板=jinja2。模板(r''
{%1%范围内的i}你好世界{{i}{%endfor%}
{2%}foo bar{{i}{%endfor%}
{{SLOW()}}
'''
)
#下面是我们要介绍的内容
pr.enable()
上下文={“RANGE1”:范围(1000000),“RANGE2”:范围(100),“SLOW”:SLOW}
template.render(上下文)
pr.disable()
s=StringIO.StringIO()
ps=pstats.Stats(pr,stream=s).sort_Stats(“累计”)
ps.打印统计数据()
打印(s.getvalue())
以下是报告的一个片段:

         1000130 function calls in 2.448 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.438    2.438 /usr/local/lib/python2.7/dist-packages/jinja2/environment.py:974(render)
        1    0.122    0.122    2.438    2.438 {method 'join' of 'unicode' objects}
  1000104    0.315    0.000    2.317    0.000 <template>:5(root)
        1    0.000    0.000    2.002    2.002 /usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:169(call)
        1    0.000    0.000    2.002    2.002 profilej.py:10(slow)
        1    2.002    2.002    2.002    2.002 {time.sleep}
        2    0.010    0.005    0.010    0.005 {range}
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/environment.py:1015(new_context)
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:55(new_context)
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:115(__init__)
        3    0.000    0.000    0.000    0.000 {hasattr}
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/_compat.py:59(<lambda>)
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/nodes.py:81(__init__)
        3    0.000    0.000    0.000    0.000 {getattr}
        3    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:149(resolve)
        1    0.000    0.000    0.000    0.000 /usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:126(<genexpr>)
        1    0.000    0.000    0.000    0.000 {callable}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    0.000    0.000    0.000    0.000 {method 'iteritems' of 'dict' objects}
        1    0.000    0.000    0.000    0.000 {isinstance}
1000130函数调用只需2.448秒
排序人:累计时间
ncalls tottime percall cumtime percall文件名:lineno(函数)
1 0.000 0.000 2.438 2.438/usr/local/lib/python2.7/dist-packages/jinja2/environment.py:974(渲染)
1 0.122 0.122 2.438 2.438{“unicode”对象的方法“连接”}
1000104 0.315 0.000 2.317 0.000:5(根)
1 0.000 0.000 2.002 2.002/usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:169(调用)
1 0.000 0.000 2.002 2.002剖面图J.py:10(慢速)
1 2.002 2.002 2.002 2.002{time.sleep}
2 0.010 0.005 0.010 0.005{range}
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist-packages/jinja2/environment.py:1015(新上下文)
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:55(新上下文)
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:115
3 0.000 0.000 0.000 0.000{hasattr}
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist packages/jinja2/_compat.py:59()
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist packages/jinja2/nodes.py:81
3 0.000 0.000 0.000 0.000{getattr}
3 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:149(解析)
1 0.000 0.000 0.000 0.000/usr/local/lib/python2.7/dist-packages/jinja2/runtime.py:126()
1 0.000 0.000 0.000 0.000{callable}
1 0.000 0.000 0.000 0.000{方法'disable'的''lsprof.Profiler'对象}
1 0.000 0.000 0.000 0.000{“dict”对象的“iteritems”方法}
1 0.000 0.000 0.000 0.000{isinstance}
正如我所说,我没有太多解释分析器输出的经验,但我认为在这个示例中,您可以看到程序在time.sleep上花费了略多于2秒的时间,这是由slow()调用的。其余的时间被join占用。我假设Jinja2就是这样处理我的两个for循环的

将此示例改编为flask应用程序应该不会太难,只要在模板生成步骤周围添加分析位,并将报告写入文件即可。也许您甚至可以从web应用程序中提取模板,并在flask之外对其进行分析


我希望这会有所帮助。

对于运行Flask服务器这样的多线程应用程序,我发现常用的Python评测工具并没有那么好

我已经有了很好的结果,它是为多线程应用程序设计的。这很简单:

import yappi
yappi.start()

   [.. do stuff ..]

yappi.stop()
yappi.convert2pstats(yappi.get_func_stats()).dump_stats('myfile.pstats')
将配置文件数据保存在兼容的文件中,以便您可以在python中以交互方式检查它:

>>> import pstats 
>>> s = pstats.Stats('myfile.pstats')
>>> s.strip_dirs().sort_stats('cumtime').print_stats()

如果你想变得聪明,你可以将
start()
位和
stop()
位放在Flask Handler中,这样你就可以点击一个URL开始评测,驱动你的应用程序,然后点击另一个URL停止评测并写出统计文件

@akai:我不知道,但它看起来像蟒蛇。我认为在工具栏中的分析器中,您可以看到所有调用的方法。如果您手动筛选前面有jinja2的对象(即),您可能有渲染时间的估计值。可能有相关问题吗@MikeDunlavey答案很有趣,但在这种情况下似乎没有帮助。我试过了,但是stacktrace报告进程只在一行html代码处停止了—也就是说,jinja2模板中没有python代码—随后出现了一些jinja2内部代码,但没有显示在中断之前呈现的模板行。@AlexeySmirnov,尽管如果不是来自jinja2的慢速函数,这不起作用(例如,从flask),我觉得查看分析结果无论如何都是“最好”的方法,也许……好吧,我认为这与flask debugtoolbar提供的方法是一样的。我也尝试过,但我发现这比flask debugtoolbar没有多大帮助(至少在jinja2渲染方面)。