2017-05-19 30 views
1

我有一個從django queryset返回的大型數據集,我想遍歷它。我應該直接迭代查詢集還是將結果存儲在變量中並迭代它?我應該迭代Django查詢集或通過變量?

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

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

據我所知,變量存儲在堆棧和安全,其中在迭代查詢集的情況下,其結果將被存儲在主存儲器中。

那麼哪一個在空間和速度上是有效的?

+0

兩者都是相同的,但是如果你使用一個變量,它只需一行代碼,當你完成它將它保存在內存中,第二次它不查詢數據庫。所以你可以理解, – Exprator

回答

2

沒有區別。 Python不區分堆和「主內存」(或堆棧)上的數據;至少在CPython中,所有數據都存儲在堆中,堆棧包含對該數據的引用。見this question

這裏唯一的考慮是您是否需要在同一範圍內再次引用查詢集。如果你這樣做,將它存儲在一個變量中;如果沒有,那麼就沒有必要。

0

如果你的數據集很大,你可以使用iterator來減少內存負載並提高性能,例如,

results = Model.objects.all() 

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

只有在真正需要時才應該這樣做,因爲它會禁用查詢集緩存。之後重新使用查詢集會導致較差的性能。