11

突然、ジェネレーターを使用して結果セットを反復する次の方法は、通常の反復に対してプラスまたはマイナスの影響を与えるのでしょうか?

例えば。

def all_items_generator():
  for item in Item.objects.all():
    yield item

for item in all_items_generator():
  do_stuff_with_item(item)

に対して:

for item in Item.objects.all():
  do_stuff_with_item(item)
4

2 に答える 2

23

前者は、すべてのモデルを含むリストを作成してから一度に1つずつ生成するため、速度が低下しますが、後者はリストを直接使用します。ジェネレータが必要な場合は、QuerySet.iterator()代わりに使用する必要があります。

于 2012-09-06T02:59:14.783 に答える
5

いいえ。それはより冗長で冗長であり、特に有用ではないという事実を除いて(提供したジェネレーターのコンテキストでは)。

で行うItem.objects.all()と、クエリキャッシュ ( source ) を使用して反復for子を使用して反復処理されます。結果をキャッシュしたくない場合は、Ignacio が推奨するように使用してください。iterator()

于 2012-09-06T03:06:25.813 に答える