为什么使用聚合来查找平均值而不是在 django 中使用 tutal_sum/n
Why use aggregate to find average value instead of using tutal_sum/n in django
这里我们使用聚合计算
>>> 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
我想知道使用聚合而不是第二个过程。
第一项将计算数据库端的平均值。因此,这意味着您执行确定平均值的查询。这通常更快,因为数据库旨在计算这一点,更重要的是:它将减少数据库和 Django/Python 层之间的带宽,因为数据库只会 return one行:包含average_price
.
的行
在您的第二个 codefragme 中,您将从数据库中检索 所有 项并使用 Django 反序列化这些项。因此,这意味着如果有数千条记录,加载所有项目将需要一些时间。然后事实证明我们只对查询集中项目的价格和长度感兴趣。
如果记录数非常多,例如 100'0000,您的 Python 网络服务器甚至可能 运行 内存不足。
Book.objects.aggregate(average_price=Avg('price'))
- 这将转换为等效的 SQL 查询并在数据库上执行并直接获取聚合数据。这样更快。
而使用第二种方法
- 你从数据库中获取所有对象,
- 使用
sum()
计算价格总和,然后
- 使用
len()
找到a
的长度,然后
- 使用除法得到结果。
第二种方法比第一种方法的开销更大,因为涉及函数调用、执行除法、将对象加载到列表等,
这里我们使用聚合计算
>>> 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
我想知道使用聚合而不是第二个过程。
第一项将计算数据库端的平均值。因此,这意味着您执行确定平均值的查询。这通常更快,因为数据库旨在计算这一点,更重要的是:它将减少数据库和 Django/Python 层之间的带宽,因为数据库只会 return one行:包含average_price
.
在您的第二个 codefragme 中,您将从数据库中检索 所有 项并使用 Django 反序列化这些项。因此,这意味着如果有数千条记录,加载所有项目将需要一些时间。然后事实证明我们只对查询集中项目的价格和长度感兴趣。
如果记录数非常多,例如 100'0000,您的 Python 网络服务器甚至可能 运行 内存不足。
Book.objects.aggregate(average_price=Avg('price'))
- 这将转换为等效的 SQL 查询并在数据库上执行并直接获取聚合数据。这样更快。
而使用第二种方法
- 你从数据库中获取所有对象,
- 使用
sum()
计算价格总和,然后 - 使用
len()
找到a
的长度,然后 - 使用除法得到结果。
第二种方法比第一种方法的开销更大,因为涉及函数调用、执行除法、将对象加载到列表等,