-
count()与len()性能比较
Django-ORM查询queryset数据集是惰性查询的,只有使用到数据集时,ORM才会真正去执行查询语句,然后ORM会把查询到的数据集缓存到内存中,下次我们使用数据集时是从缓存中取值的。- 1.如果queryset数据集被使用然后缓存,我们使用queryset对象结果集count()时其底层源码如下图是用len()计算结果集长度的,所以在此场景有缓存的情况下用len()和count()来计算查询结果集的效果是一样的;
- 2.如果只想获得queryset数据的长度而不做其他操作,count()底层实现用的是数据库的聚合函数查询计算结果,然后取其结果时间复杂度是O(1),空间复杂度为O(1),而len()底层实现是是需要获取整个queryset数据集时间复杂度为O(n),并且空间复杂度也为O(n),这种情况下使用count()更好;
- 3.如果既要计算queryset数据集的长度,又要对queryset数据集做其他操作(如获取每个queryset对象的属性等),使用len()计算长度时会比count()会更有优势,因为此时少了一次对数据的聚合查询操作。
- 4.如果对还未使用的queryset数据集,使用len()或者count()来计算结果集的长度,然后使用分页组件对数据集进行分页处理,最后使用我们分页后的结果集。此场景需要考虑以下几个因素:
- (1)如果此时我们使用的是len()的话我们会缓存整个queryset结果集,并相当于遍历了整个结果集时间复杂度为O(n),空间复杂度为O(n),分页操作对于我们后端的时间或者空间来说都没什么太大帮助了;
- (2)如果此时我们使用的是count()来计算长度的话,我们会多一次数据库查询操作&