接下来我将从源码层面分情况和应用分析我们在计算queryset数据集时是用orm的count函数计算长度还是用len函数计算数据集长度。

  首先,我们知道ORM查询queryset数据集是惰性查询的,只有使用到数据集时,ORM才会真正去执行查询语句,然后ORM会把查询到的数据集缓存到内存中,下次我们使用数据集时是从缓存中取值的。这就是ORM的惰性查询机制和缓存机制,还不清楚可以找相应的博客了解其概念,首先理解这两点我们便能更好地理解接下来的场景及应用。

  1.、场景一:queryset数据集已经使用然后缓存的情况下,我们使用queryset对象.count()方法时其底层源码是用的len()方法计算数量,所以在有缓存时用len()和count()是一样的;

  2、场景二:如果我们只想获得queryset对象的长度而不使用queryset对象的其他操作的情况下,count函数底层用了数据库的聚合函数查询计算结果,

然后取其结果时间复杂度是O(1),而len方法底层实现是是需要获取整个queryset数据集时间复杂度为O(n),并且空间复杂度也为O(n),

这种场景下使用count函数更好;

  3、场景三:在初始我们写了ORM查询语句,然后接下来我们既要计算查询后结果集的长度,又要对结果集做其他操作(如获取每个queryset对象的属性等),(这里暂时不考虑分页时limit减小查询范围的情况)。

接下来我们分析len方法和count方法他们分别会做什么事情,首先如果是len操作的话会先触发orm的查询操作得到queryset结果集然后缓存,然后后续对结果集的操作直接从缓存中取对应的queryset对象,然后是count函数操作因为之前我们讲过ORM的惰性查询机制,在我们执行count函数的时其实这时查询操作还未真正的运行,也就是此时还没有queryset结果集的缓存,所以此时我们执行count方法会执行一次聚合函数查询,然后后续我们使用到queryset集合时就会触发数据库查询得到queryset结果集然后缓存。

所以在场景三的情况下,使用len()方法计算结果集的长度时会比count方法会更有优势,因为此时少了一次对数据的聚合查询操作。

  4、场景四:如果是在先执行了数据库查询结果集并使用到了queryset结果有了缓存的情况下,参考场景一此时用len方法或者count方法的效果是一样的。

  5、场景五:这也是最复杂也比较难判断的情况,首先步骤一:我们写了数据库查询操作(此时还未使用到这个查询的结果集),然后步骤二这里我们可能使用len方法或者count方法来计算结果集的长度,接下来步骤三我们使用分页组件对结果集进行分页处理,再步骤四使用我们分页后的结果集。

这种场景的话对于步骤二我们是使用len方法还是count方法来计算结果集的长度时就需要我们考虑以下几个因素了,

1)如果此时我们使用的是len方法的话我们会缓存整个queryset结果集,并相当于遍历了整个结果集时间复杂度为O(n),空间复杂度为O(n),步骤三的分页操作对于我们后端的时间或者空间来说都没什么太大帮助了

2)如果此时我们使用的是count()方法来计算长度的话,我们会多一次数据库查询操作,但是步骤三的分页操作相当于查询结果集时sql语句然后limit 10(数字取决于我们分页的size),这样我们的时间复杂度和空间复杂度都可以降到O(1)

个人倾向的话可能在此种情况我会使用count方法,通过多一次数据库查询操作来降低时间和空间的复杂度还是挺划算的。

Django ORM性能优化之count和len方法的选择(非常详细推荐干货)的更多相关文章

  1. Django ORM性能优化 和 图片验证码

    一,ORM性能相关 1. 关联外键, 只拿一次数据 all_users = models.User.objects.all().values('name', 'age', 'role__name') ...

  2. python django ORM 性能优化 select_related & prefetch_related

    q = models.UserInfo.objects.all() select * from userinfo select * from userinfo inner join usertype ...

  3. Django的性能优化

    Django的性能优化   一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引, ...

  4. Django之缓存+序列化+信号+ORM性能优化+验证码

    缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加 明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcach ...

  5. Django数据库性能优化之 - 使用Python集合操作

    前言 最近有个新需求: 人员基础信息(记作人员A),10w 某种类型的人员信息(记作人员B),1000 要求在后台上(Django Admin)分别展示:已录入A的人员B列表.未录入的人员B列表 团队 ...

  6. laravel 5.1 性能优化对比 - 框架提供的方法

    写了一个项目发现性能不如人意. 于是便测试下, 看下性能瓶颈在什么地方. 使用 ab -n 20 http://www.lartest.com/ 软件环境: OS : windows 8.1 CPU: ...

  7. 移动端 CPU 的深度学习模型推理性能优化——NCHW44 和 Record 原理方法详解

    用户实践系列,将收录 MegEngine 用户在框架实践过程中的心得体会文章,希望能够帮助有同样使用场景的小伙伴,更好地了解和使用 MegEngine ~ 作者:王雷 | 旷视科技 研发工程师 背景 ...

  8. Java 性能优化之 String 篇

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...

  9. 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇

    平均负载 指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数 可运行状态:正在使用CPU或者正在等待CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态 (Run ...

随机推荐

  1. 总结:js世界中的特殊符号

    常用符号:+ ++ - -- || / /' && 等 这些基本上每天都能用到,但是 js 世界中有些特殊符号是不常用的,我也是偶然在阅读大神代码的时候发现的,一番查找之后得出了以下结 ...

  2. Python执行Linux cmd命令,获取输出的一种方法,输出是bytes

    import subprocess p = subprocess.Popen('df -lh', stdout=subprocess.PIPE, shell=True) print(p.stdout. ...

  3. MySql id 设定为主键不自增后,再给 sort 字段增加自增属性

    需求 id 已经被设置为主键,但是没有给它设置 自增 属性.sort 起到一个排序的作用,需要给它设置一个 自增 属性 加自增属性的前提 表中的属性没有增加自增 赋予自增属性的字段,必须带有 索引 S ...

  4. Spring5参考指南:AspectJ注解

    文章目录 什么是AspectJ注解 启用AOP 定义Aspect 定义Pointcut 切入点指示符(PCD) 切入点组合 Advice 访问JoinPoint Advice参数 Advice参数和泛 ...

  5. 联想在S规则债券市场完成了里程碑式的新债券发行

    腾讯科技讯,香港,2020 年 4 月 24 日-联想集团(HKSE:992)(ADR:LNVGY)今日宣布,在S规则债券市场上成功发行了里程碑式的 6.5 亿美元债券. 这些债券吸引了全球大量固定收 ...

  6. 【Linux题目】第九关

    前言:项目整合 企业项目实战考试: 1. 全网备份解决方案实战 2. NFS集群后段共享存储搭建优化 3. 解决NFS单点实现实时数据同步. 环境: 服务器角色 外网ip 内网ip 主机名 web 1 ...

  7. bootstrap-分页-默认分页

    说明 默认分页 示例 <!DOCTYPE html> <html lang="zh-CN">    <head>      <meta c ...

  8. Character Array and Character Pointer

    最近复习数据结构实验时,碰到这么一行代码,看的有点不爽. typedef char** HuffmanCode; 借此梳理下数组和指针. int* p; //指针变量p中存的地址代表的内存单元中的数据 ...

  9. Servlet --启动时创建、配置url、ServlectContext、初始化参数、获取资源

    servlet的版本的区别 2.5版本, Servlet的配置只支持在xml文件中的配置 3.0版本: Servlet的配置支持在xml文件中的配置, 也可以使用注解的方式, 默认使用注解 让服务器在 ...

  10. 解决python语言的工具pycharm以及Windows电脑安装pygame模块的问题

    人生苦短,我用python,python作为一门当今时代潮流性的语言,已经成为大多数的年轻程序猿们向往的目标,python中有许多的库, 其中有一个pygame库是作为开发2D游戏必不可少的开发库,是 ...