2017-05-19 7 views
1

私はdjango querysetから返された大きなデータセットを持っており、それを反復したいと思います。クエリーセットを直接反復処理するか、結果を変数に格納してそれを反復処理する必要がありますか?djangoクエリセットまたはその変数に対して反復処理を行うべきですか?

for item in Model.objects.all(): 
    do_something() 

または

results = item in Model.objects.all(): 
for item in results: 
    do_something() 

クエリセットを反復処理の場合のように、結果はメインメモリに格納される場所を私の知る限りでは、変数は、ヒープに格納し、その方が安全です。

どのスペースとスピードで効率的ですか?

+0

両方とも同じですが、変数を使用するとコードが1行だけ増えます。すべての場合はメモリに保存され、2回目はデータベースにクエリが実行されません。あなたが理解できるように、 – Exprator

答えて

2

違いはありません。 Pythonは、ヒープ上のデータと "メインメモリ"(またはスタック)を区別しません。 CPythonでは、少なくともすべてのデータはヒープに格納され、スタックにはそのデータへの参照が含まれています。 this questionを参照してください。

ここでの唯一の考慮点は、クエリーセットを同じ範囲で再度参照する必要があるかどうかです。そうした場合は、変数に格納します。そうでなければ、必要はありません。

0

データセットが巨大な場合は、iteratorを使用してメモリの負荷を軽減し、パフォーマンスを向上させることができます。

本当に必要な場合は、クエリーセットキャッシングを無効にするため、これを行う必要があります。この後にクエリーセットを再使用すると、パフォーマンスが低下します。

関連する問題