簡體   English   中英

如何配置Jinja2模板?

[英]How to profile a Jinja2 template?

我正在分析的Flask應用程序花費很長時間來渲染其Jinja2模板。

我已經安裝了flask lineprofilerpanel這很有意思,但遺憾的是我不會深入到模板渲染中查看所有時間花在哪里。

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

好問題。 我通常不太習慣使用剖析器,所以這是學習的好借口。 按照這里的例子: https//docs.python.org/2/library/profile.html#module-cProfile我編寫了一個簡單的分析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())

以下是報告的片段:

         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()調用。 剩下的時間由加入占用。 我認為這就是Jinja2如何處理我的兩個for循環。

將此示例調整為燒瓶應用程序應該不會太難,只需在模板生成步驟周圍添加分析位並將報告寫入文件。 也許您甚至可以從Web應用程序中提取模板並將其分析到燒瓶外。

我希望這是有幫助的。

對於像運行Flask服務器這樣的多線程應用程序,我發現通常的Python分析工具並不是那么好。

我使用專為多線程應用程序設計的yappi取得了不錯的成績。 這非常簡單:

import yappi
yappi.start()

   [.. do stuff ..]

yappi.stop()
yappi.convert2pstats(yappi.get_func_stats()).dump_stats('myfile.pstats')

這將配置文件數據保存在pstats兼容文件中,因此您可以在python中以交互方式檢查它:

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

如果你想聰明一點,你可以在Flask處理程序中放置start()位和stop()位,這樣你就可以點擊一個URL來開始分析,驅動你的應用程序,然后點擊另一個URL來停止分析並寫出統計數據文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM