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

Sai*_*rsi 6 python django django-queryset

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

for item in Model.objects.all():
    do_something()
Run Code Online (Sandbox Code Playgroud)

要么

results = Model.objects.all():
for item in results:
    do_something()
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*man 11

没有区别。Python 不区分堆上的数据和“主内存”(或堆栈)上的数据;至少在 CPython 中,所有数据都存储在堆上,堆栈包含对该数据的引用。看到这个问题

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


Mat*_*att 6

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

results = Model.objects.all()

for item in results.iterator():
    do_something()
Run Code Online (Sandbox Code Playgroud)

您应该只在确实有必要时才这样做,因为它会禁用查询集缓存。在此之后重新使用查询集会导致性能下降。