我应该迭代django查询集还是变量?

时间:2017-05-19 09:14:28

标签: python django django-queryset

我有一个从django queryset返回的大型数据集,我想迭代它。我应该直接遍历查询集还是将结果存储在变量中并迭代它?

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

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

据我所知,变量存储在堆中并且更安全,在迭代查询集的情况下,结果将存储在主内存中。

那么哪一个在空间和速度上都很有效?

2 个答案:

答案 0 :(得分:4)

没有区别。 Python不区分堆上的数据和“主内存”(或堆栈);至少在CPython中,所有数据都存储在堆上,并且堆栈包含对该数据的引用。请参阅this question

此处唯一的考虑因素是您是否需要在同一范围内再次引用查询集。如果这样做,请将其存储在变量中;如果没有,则没有必要。

答案 1 :(得分:0)

如果您的数据集很大,您可以使用iterator来减少内存负载并提高性能,例如

results = Model.objects.all()

for item in results.iterator():
    do_something()

如果真的有必要,你应该这样做,因为它禁用了查询集缓存。在此之后重新使用查询集将导致较差的性能。