django - Django ORM 性能问题
问题描述
我正在循环超过 13,000 个内存城市名称并生成查询以过滤某些内容。我遇到了一些我无法解释的事情......
当循环只有一行时:
cities = City.objects.filter(name__iexact=city)
性能几乎是800 项/秒
当循环测量返回集合的长度时......
cities = City.objects.filter(name__iexact=city)
num_citles = len(cities)
性能下降到8 项/秒
我无法解释性能下降发生在哪里。显然,我遗漏了一些东西......为什么要计算总是在 0 到 3 个项目之间的内存数组中的项目数会降低 x100 倍的性能?
解决方案
Django 查询集是惰性的,因此QuerySet.filter
实际上并不评估查询集,即在数据库中运行查询。当你在它上面运行len
函数时,它会被评估,它会在运行过滤器后从数据库中获取所有项目以获取计数。因此,count
速度非常慢。
COUNT
如果您在数据库级别运行,您将获得更好的性能:
num_cities = City.objects.filter(name__iexact=city).count()
推荐阅读
- java - 使用 Midtrans (Android) 修复支付网关上的不成功交易
- wordpress - 在 Wordpress 中为插件添加样式表,而不是主题
- android - 来自 Vue.js 应用程序的 Android JS Bridge
- python - 喜欢使用 Django Rest Framework 的按钮后端逻辑
- python-3.x - 如何使用 AppEngine 在 Firestore 模拟器中打印?
- python - 当它们在熊猫列中时如何检查一个列表的元素是否是另一个
- rabbitmq - Google 日历 API:com.google.api.client.googleapis.json.GoogleJsonResponseException:404 未找到
- c++ - C++ 调整 2d 向量的大小,其中函数为 const
- python - pytest - 将值从一个测试函数传递到测试文件中的另一个函数
- mysql - 有没有办法将值插入到一个表中,然后更新另一个表中的值?mysql