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

前者会更慢,因为它将创建一个包含所有模型的列表,然后一次生成一个,而后者将直接使用该列表。如果你想要一个生成器,那么你应该使用它QuerySet.iterator()

于 2012-09-06T02:59:14.783 回答
5

不。除了它更冗长、多余且不是特别有用(在您提供的生成器的上下文中)之外。

当您Item.objects.all()在 a中执行操作时for,它们会使用带有查询缓存(source)的迭代器进行迭代。如果您不想缓存结果,请按照Ignacio 的建议使用。iterator()

于 2012-09-06T03:06:25.813 回答