模板里写 {{ fmt(price) }} 有多贵?宏和 include 的代价呢?什么该在模板里算、什么该在视图里先算好?这篇对 1000 行表格做一组苹果对苹果的对比(输出相同,只改写法)。
预先在 Python 里算好 r.price_text(基线) 1.927 ms ( 1.00×) 全局函数 fmt_price(r.price) 2.715 ms ( 1.41×) 过滤器 r.price|fmt 2.245 ms ( 1.16×) 对象方法 r.price_text() 2.003 ms ( 1.04×)
上一篇:Jinja2 Bytecode Cache;下一篇:Flask Config 加载顺序。宏与 include 的写法见Jinja2 宏。
直接写 2.084 ms ( 1.00×) macro cell() 每行 3 次调用 6.643 ms ( 3.19×) 每行 include 一个模板 4.278 ms ( 2.05×)
set:1.521 ms;不 set(算三遍):2.119 ms;不 set 是 set 的 1.39 倍
selectattr(price>500):模板里做 0.885 ms;Python 里先过滤再渲染 0.443 ms(这一步 Python 过滤本身另需约 0.03 ms) sort(price 降序):模板里做 0.949 ms;Python 里先排序再渲染 0.653 ms
渲染 3 行,全局函数调用 3 次 渲染 1000 行,全局函数调用 1000 次
不调用慢函数 0.152 ms;每行调用一次慢函数 31.44 ms(约 206 倍);200 行 × 0.1 ms ≈ 20 ms 的纯等待(sleep 实际约 0.15 ms)