9

django 1.4 のデフォルト テンプレート システムを使用して適度に複雑な辞書 (4 レベルの深さ、~2K データ ポイント) をレンダリングすると、テンプレート レンダリング ステップに 2800 ミリ秒以上かかります。代わりに、python から直接 html-gen を実行すると、約 80 ミリ秒かかります。別のテンプレート ライブラリ ( jinja2 ) を使用しても、同じデータが 300 ミリ秒未満でレンダリングされます (実際、ほとんど同じテンプレート構文 - jinja2 はほとんどドロップインの代替品であるため)。

興味深いことに、 django のテンプレート システムでこのパフォーマンスの問題を引き起こすために、実際にテンプレートでディクショナリをレンダリングする必要さえありません。必要なのは、使用可能な変数としてテンプレートに渡すことだけです。私の友人は、これはシステムが「...防御的なコピーを行っているか、(もっとばかげた) 実行中のコンストラクターのために時間がかかる理解を行っている」ことを意味している可能性があると示唆しました。

django のデフォルトのテンプレート システムが辞書のレンダリングに時間がかかる理由を知っている人はいますか?

* リクエストされた詳細を以下に追加する作業を行います *

デバッグ モードで実行しており、ミドルウェア クラスの 1 つとして DebugToolbarMiddleware を設定しています。私のsettings.pyファイルには以下が含まれます:

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'django.core.context_processors.request',
)

と....

# rendering like this
return render(
    request,
    template_name='ltm/search_results.html',
    context_instance=RequestContext(request, {
        'menus': menus,
        'results': result_dict
    })
)
4

1 に答える 1

2

どのような種類のテンプレート処理を正確に処理しているかをよりよく理解するために、テンプレート コードを提供していただければ幸いです。

まず、辞書の内容をたどる方法には潜在的な違いがあります。dict.items()追加のメモリを消費し、最初の構築に時間がかかるタプルのリストを返しますが、dict.iteritems().

また、ドットが前に付いた変数名を渡す場合にも、オーバーヘッドが伴います.。たとえば、Django のテンプレートでは、変数ルックアップfoo.bar.bazと呼ばれるものを実行し、辞書項目にキーでアクセスするか、オブジェクトの属性にアクセスするか、インデックスでリスト項目にアクセスするかを判断しようとします。私は Jinja2 を使用したことがないので、変数ルックアップの問題はまったく無関係かもしれませんが、両者に違いがある場合は検討する価値があります。

どちらの場合も、かなり大きなディクショナリを扱っているため、後でテンプレート内でデータにアクセスする方法を簡素化するために、ビュー内の構造を再編成できると役立つ場合があります。

于 2012-11-06T21:28:43.307 に答える