web-dev-qa-db-ja.com

Pythonの最速のテンプレートシステムは何ですか?

Jinja2とMakoはどちらもかなり高速であるようです。

これらは(あまり機能的ではありませんが、おそらく私がやっていることには十分です)string.Templateとどのように比較しますか?

52
Josh Gibson

以下は、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

ベンチマークは Spitfireパフォーマンステストからのコード に基づいており、いくつかのテンプレートエンジンと反復を追加して精度を高めています。最後のリストとジェネレータの連結はPythonバイトコードにコンパイルすることで達成可能なパフォーマンスの上限を感じ取るために、Pythonで手作業でコーディングされています。最適化されたバージョンは、内部ループで文字列補間を使用します。

しかし、テンプレートエンジンを切り替えるために不足する前に、それが重要であることを確認してください。コンパイルテンプレートエンジン間の違いが問題になる前に、かなり重いキャッシングと本当に最適化されたコードを実行する必要があります。ほとんどのアプリケーションでは、優れた抽象化機能、設計ツールとの互換性、親しみやすさなどがはるかに重要です。

99
Ants Aasma

jinja2 docs から、string.Templateが必要な場合は最速のようです。

間違いなく、できるだけ多くのロジックをテンプレートから削除する必要があります。しかし、ロジックのないテンプレートは、退屈で愚かなコードですべての処理を行わなければならないことを意味します。これを実行するテンプレートエンジンは、Pythonと呼ばれ、string.Templateと呼ばれます。ループがなく、if条件が付属しており、Pythonで入手できる最速のテンプレートエンジンです。

10
Josh Gibson

(memcachedのように)混合でキャッシングをスローできる場合は、最適化ではなく機能と使いやすさに基づいて選択します。

構文と機能が好きなので、Makoを使用します。幸いにも、それは最速の1つでもあります。

3
Tony

テンプレートをどのように使用するか、何のために使用するかによりますが、一般的には、その質問に答えるためにプロファイリングを行う必要があります。

string.Templateは最も高速ですが、プリミティブなので、文字列の置換のみを行い、条件やループがないため、実際にはほとんど役に立たないため、他のテンプレートシステムと同じようにテンプレートと呼ぶことはほとんどできません。

1
Lennart Regebro