【问题标题】:What is the fastest template system for Python?Python最快的模板系统是什么?
【发布时间】:2010-11-22 09:27:02
【问题描述】:

Jinja2 和 Mako 显然都相当快。

这些与(功能较少但可能对我正在做的事情足够好)string.Template 相比如何?

【问题讨论】:

  • “比较”?你想比较速度吗? jinja 人说 string.Template 更快。你还需要知道什么?还是要比较其他方面?
  • 您可能不在乎模板系统有多快。在流行的那些中,它们都具有完全可以接受的性能特征。请根据更重要的事情做出这样的决定,例如易于编程。
  • 这取决于,真的。在我工作的地方,我们每秒提供大量模板,并且我们拥有一支技术精湛的编码人员和设计师队伍,因此在这种情况下,速度比“易于编程”更重要。此外,我会说易于阅读比易于编程更重要。
  • @Emil,嘿,为什么要回滚?
  • @techtonik 如果您有更多信息要添加,可以在新答案中添加 - 更改答案的实际内容被认为是不好的做法 :)

标签: python django-templates template-engine mako jinja2


【解决方案1】:

以下是用于呈现 10x1000 HTML 表格的流行模板引擎的结果。

Python 2.6.2 on a 3GHz Intel Core 2

Kid template                         696.89 ms
Kid template + cElementTree          649.88 ms
Genshi template + tag builder        431.01 ms
Genshi tag builder                   389.39 ms
Django template                      352.68 ms
Genshi template                      266.35 ms
ElementTree                          180.06 ms
cElementTree                         107.85 ms
StringIO                              41.48 ms
Jinja 2                               36.38 ms
Cheetah template                      34.66 ms
Mako Template                         29.06 ms
Spitfire template                     21.80 ms
Tenjin                                18.39 ms
Spitfire template -O1                 11.86 ms
cStringIO                              5.80 ms
Spitfire template -O3                  4.91 ms
Spitfire template -O2                  4.82 ms
generator concat                       4.06 ms
list concat                            3.99 ms
generator concat optimized             2.84 ms
list concat optimized                  2.62 ms

基准测试基于code from Spitfire performance tests,添加了一些模板引擎并添加了迭代以提高准确性。最后的列表和生成器 concat 是手动编码的 Python,以了解通过编译为 Python 字节码可实现的性能上限。优化后的版本在内循环中使用字符串插值。

但在您用完切换模板引擎之前,请确保它很重要。在编译模板引擎之间的差异开始变得重要之前,您需要进行一些非常繁重的缓存和真正优化的代码。对于大多数应用程序而言,良好的抽象设施、与设计工具的兼容性、熟悉度和其他事情要重要得多。

【讨论】:

  • 我不知道Django模板这么慢。
  • 我也没有。对于大多数人来说,这只是等式的一小部分,但是如果您要渲染 10x1000 的数据表,那么您就有麻烦了。
  • 当然,这种比较很大程度上取决于您在做什么。如果您要渲染大量小模板而不是一张大表格怎么办?然后模板引擎的完全不同的性能特征将变得相关,例如模板解析和加载时间。道德?根据您自己的代码基准做出优化决策。
  • 是的,Tenjin 每次渲染的加载时间为 3 毫秒,在我的论坛中,有线程 cmets Cheetah 需要 0.4 毫秒来发表 1 条评论,而 tenjin 需要 3 毫秒,在 50 cmets 时,tenjin 和猎豹在 5 毫秒时相遇. 5000 天神是 40 毫秒猎豹是 250 毫秒。
  • 我有 my own copy of the "bigtable" (10x1000) test 用于基准测试,在发现其他轮子都是方形的(没有中游冲洗、次优性能、热闹的复杂性)后编写了自己的引擎。如果 TTFB 对您很重要,那么 0.02 毫秒(47,938 代/秒)似乎稳稳地赢得了“最快”徽章。 (与 Tenjin 的 50 代/秒相比)
【解决方案2】:

jinja2 docs 看来,如果您需要的话,string.Template 似乎是最快的。

毫无疑问,您应该尝试 从模板中删除尽可能多的逻辑 可能的。但是没有任何模板 逻辑意味着你必须做所有 处理无聊的代码 和愚蠢的。一个模板引擎, 是否随 Python 一起提供,并且 称为字符串.模板。没有 循环和 if 条件和到目前为止 最快的模板引擎 获取 Python。

【讨论】:

    【解决方案3】:

    如果您可以混合使用缓存(如 memcached),那么请根据功能和易用性而不是优化来选择。

    我使用 Mako 是因为我喜欢它的语法和功能。幸运的是,它也是最快的之一。

    【讨论】:

    • 我们曾经使用 Mako 模板,直到我们的数兆字节的 RSS 提要开始无法及时生成(It's also not particularly fast. 它与 Bottle 的引擎或 Tenjin 属于同一级别,但与我自己的引擎相比相形见绌,后者确实支持中游冲洗。 (48 代/秒 vs. 47,937 代/秒。)(现在,即使提要的生成时间超过 30 秒,它也不会超时,而是流式传输。)
    【解决方案4】:

    一般来说,您必须进行分析才能回答该问题,因为这取决于您使用模板的方式和用途。

    string.Template 是最快的,但是太原始了,它几乎不能和其他模板系统一样被称为模板,因为它只做字符串替换,没有条件或循环,在实践中非常无用.

    【讨论】:

      【解决方案5】:

      我认为 Cheetah 可能是最快的,因为它是用 C 语言实现的。

      【讨论】:

      • 仅仅因为有些东西是用C写的,并不意味着它会更快;这些东西高度依赖于开发者。
      • 是的,kzh 是真的。此外,Cheetah 不是用 C 编写的——它是用 Python 编写的。但是,其中的一小部分,即“名称映射器”,可以选择使用更快的编译 C 版本。
      • 我曾经用 Python 写过一个 HTTP/1.1 服务器。为了规范标头名称,在 WSGI 下必须是 ALL_UPPER_UND_SEP(a la CGI),我想,哎呀,C 代码必须对此有效,所以我从 Rack 或另一个 Ruby Web 服务器“借用”了相关的 C 模块。它是由 Ruby 生成的 1000 行 C 机器代码。尽管重复了.replace() 调用和其他过滤器(upper 等)的链,Python 的运行速度大大,并且是infinitely easier to understand
      • 啊,对,我还要指出特定于模板的基准。 Cheetah 是“大表”测试中绝对表现最差的人之一,也就是说,从一个静态的 dicts 列表中生成一个具有 10 列和 1000 行的单个 <table>It gets just under 10 generations per second. 任何现代解析器/生成器引擎都击败了它(甚至 Mako 也快了 2 倍),而我自己的流式生成方法则将其抛诸脑后。 (每秒略低于 48,000 代:因此猎豹的性能为 0.02%。不是 2%。0.02%。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多