我有一个从django queryset返回的大型数据集,我想迭代它。我应该直接遍历查询集还是将结果存储在变量中并迭代它?
for item in Model.objects.all():
do_something()
或
results = Model.objects.all():
for item in results:
do_something()
据我所知,变量存储在堆中并且更安全,在迭代查询集的情况下,结果将存储在主内存中。
那么哪一个在空间和速度上都很有效?
答案 0 :(得分:4)
没有区别。 Python不区分堆上的数据和“主内存”(或堆栈);至少在CPython中,所有数据都存储在堆上,并且堆栈包含对该数据的引用。请参阅this question。
此处唯一的考虑因素是您是否需要在同一范围内再次引用查询集。如果这样做,请将其存储在变量中;如果没有,则没有必要。
答案 1 :(得分:0)
如果您的数据集很大,您可以使用iterator
来减少内存负载并提高性能,例如
results = Model.objects.all()
for item in results.iterator():
do_something()
如果真的有必要,你应该这样做,因为它禁用了查询集缓存。在此之后重新使用查询集将导致较差的性能。