为什么要使用聚合来查找平均值,而不是使用django中的tutal_sum/n



这里我们使用聚合进行计算

>>> avg = Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}

但为什么我们不在上面使用下面的概念呢。

a = Books.objects.all()
Avg = sum([x.price for x in a])/len(a)
34.35

我想知道使用聚合而不是第二过程。

Book.objects.aggregate(average_price=Avg('price'))-它被转换为等效的SQL查询,并在DB上执行,并直接获取聚合数据。这更快。

而使用第二种方法

  • 您从DB中获取所有对象
  • 使用sum()计算价格总和,然后
  • 使用len()求出a的长度,然后
  • 使用除法来获得结果

第二种方法比第一种方法有更多的开销,因为涉及到函数调用、执行除法、将对象加载到列表等,

第一项将计算数据库端的平均值。因此,这意味着您要执行一个确定平均值的查询。这通常更快,因为数据库是为了计算这一点而设计的,而且更重要:它将减少数据库和Django/Python层之间的带宽,因为数据库只返回一个行:一个包含average_price的行。

在第二个代码片段中,您将从数据库中检索所有项,并使用Django对这些项进行反序列化。因此,这意味着,如果有1000条记录,则需要一些时间才能加载所有项目。然后我们发现我们只对查询集中项目的价格和长度感兴趣。

如果记录的数量真的很高,例如100000,那么您的Python Web服务器甚至可能会耗尽内存。

相关内容

  • 没有找到相关文章

最新更新