在 Django 中,鉴于我有一个 QuerySet
我将对其进行迭代并打印其结果,计算对象的最佳选择是什么? len(qs)
或 qs.count()
?
(还考虑到在同一次迭代中计算对象的数量不是一种选择。)
原文由 antonagestam 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Django 中,鉴于我有一个 QuerySet
我将对其进行迭代并打印其结果,计算对象的最佳选择是什么? len(qs)
或 qs.count()
?
(还考虑到在同一次迭代中计算对象的数量不是一种选择。)
原文由 antonagestam 发布,翻译遵循 CC BY-SA 4.0 许可协议
尽管 Django 文档 建议使用 count
而不是 len
:
注意:如果您只想确定集合中的记录数,请不要在 QuerySet 上使用
len()
。使用 SQL 的SELECT COUNT(*)
在数据库级别处理计数效率更高,Django 正是出于这个原因提供了count()
方法。
由于您无论如何都在迭代此 QuerySet, 结果将被缓存(除非您正在使用 iterator
),因此最好使用 len
,因为 这样可以避免再次访问数据库,还有可能检索到不同数量的结果!)。
如果您使用的是 iterator
,出于同样的原因,我建议您在迭代(而不是使用计数)时包括一个计数变量。
原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答943 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
在
len()
和count()
之间进行选择取决于具体情况,值得深入了解它们的工作原理以正确使用它们。让我为您提供几个场景:
count()
至关重要:DO:
queryset.count()
- 这将执行单个SELECT COUNT(*) FROM some_table
查询,所有计算都在 RDBMS 端进行,Python 只需要以 O(1) 的固定成本检索结果编号不要:
len(queryset)
- 这将执行SELECT * FROM some_table
查询,获取整个表 O(N) 并需要额外的 O(N) 内存来存储它。 这是最糟糕的情况len()
会稍微好一点,这不会导致额外的数据库查询,因为count()
会len()
(一个数据库查询)count()
(两个数据库查询!):一旦你看一眼“引擎盖下”,一切都会很清楚:
Django 文档中的良好参考资料: