- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在分析的 Flask 应用会花费很长时间来呈现其 Jinja2 模板。
我已经安装了flask lineprofilerpanel这很有趣,但不幸的是,我无法深入了解模板渲染以查看所有时间都花在了哪里。
分析 Jinja2 模板的最佳方法是什么?
最佳答案
好问题。我通常对分析器用处不大,所以这是学习的好借口。按照此处的示例:https://docs.python.org/2/library/profile.html#module-cProfile我编写了一个分析神社模板的简单示例。
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())
这是报告的一个片段:
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}
正如我所说,我没有太多解释分析器输出的经验,但我认为在这个例子中你可以看到程序按预期在 time.sleep 上花费了 2 秒多一点,这是由 slow() 调用的。剩下的时间由join占用。我假设这就是 Jinja2 处理我的两个 for 循环的方式。
将此示例改编成 Flask 应用程序应该不会太难,只需在模板生成步骤周围添加分析位并将报告写入文件即可。也许您甚至可以从 Web 应用程序中提取您的模板并在 Flask 之外对它们进行分析。
希望对您有所帮助。
关于python - 如何分析 Jinja2 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807187/
这是我的代码: {% if {{post.author.profile.image.url}} is None %} 当我运行这段代码时出现错误 Could not parse the remaind
我想将 jinja 循环内的单个 jinja 变量作为参数传递给 python 函数。在这种情况下,我需要将 jinja 循环内的 {{ book.isbn }} 传递给 python 函数才能使用该
问题几乎在标题中。 IntelliJ 是否具有针对 .jinja 的 native 语法高亮显示?和 .j2文件? 如果没有,是否有插件? 最佳答案 这个插件:https://plugins.jetb
我只想循环现有列表并从中创建一个逗号分隔的字符串。 像这样的东西:my_string = 'stuff,stuff,stuff,stuff' 我已经了解loop.last,我只需要知道如何使下面代码中
我在 HTML 表格中添加了复选框,我想知道是否选中了任何复选框。我有一个在 Jquery 中运行的脚本,它告诉我变量中标记的复选框的数量,但我还没有找到如何在 Jinja if 语句条件中使用 Jq
嗨,我觉得我需要为我现在挣扎了几个小时的事情提供答案。我希望有一天这对某人有所帮助。 我一直在尝试自动化 Ansible 部署的模板: 库存内容: [splunk_license] 10.10.113
我想记录我的 Jinja 宏是如何工作的。在 Jinja 中是否有用于记录宏的官方格式,就像有多种格式化 Python 文档字符串的方法一样? 也许是这样的: {% macro my_macro(ar
有没有办法加载自定义标签集 - 甚至是单个自定义标签? 在 django 模板中,我可以这样做: {% load custom_tag_set %} 有没有办法在神社中做到这一点? 最佳答案 存在相同
我正在创建一种表单,用户可以在其中添加一个或两个额外的字段...我正在使用jQuery进行交互,并使用Flask进行模板化,它看起来像这样: Add College or University
所以我试图在 url_for 中嵌套 2 个变量来提取特定人物的照片。这是我的代码 我的图像采用“用户名.png”格式,因此我在开头和结尾添加“_”。 这是它的Python部分: @app.rout
我想做的基础是使用“随机”过滤器从我的列表中选择一个随机项目,但随后我想在多个位置使用该随机选择的项目。 如何将过滤器的结果设置为可以在多个位置使用的变量。 如果我多次调用“随机”过滤器,它们几乎不可
我想知道在文件中添加包含或宏时是否有任何方法可以保持 jinja 的缩进。我想使用 jinja 生成代码文件。一个例子是 文件:class.html class MyClass: def s
我已经能够使用 BaseOperator 中的函数 render_template 成功渲染 Jinja 模板。 我的问题是,有谁知道在Rendered或Rendered Template选项卡下将渲
我从以下 ninja2 模板开始,但如果第二列的值 > 指定的宽度,它只会打印整个字符串,其余列右移。 {{ "%-7s"|format(tbl[3]) }} {{ "%-12s"|form
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
在 jinja 文件中找到其中一些: {%- else -%} 还有 {% if freeswitch_dispatcher -%} 看到破折号了吗?知道它的用途吗? 最佳答案 结果是 + 和
我从以下 ninja2 模板开始,但如果第二列的值 > 指定的宽度,它只会打印整个字符串,其余列右移。 {{ "%-7s"|format(tbl[3]) }} {{ "%-12s"|form
好的,所以我有了第一个 HTML 文件(header.html): M4A {% load staticfiles %} {% block content %}
我有一个看起来像这样的Python字典 [{"hat": 91, "d1b": 2, "d1c": 1, "d1d": 5, "d1e": 7, "d1f": 77, "d1e": 999} {"ha
我正在使用 SaltStack 来管理 BIND9 区域文件。以前我使用过这样的支柱数据: zones: example.com: a: www1: 1.2.3.4
我是一名优秀的程序员,十分优秀!