首页 > 解决方案 > 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

解决方案


Django 查询集是惰性的,因此QuerySet.filter实际上并不评估查询集,即在数据库中运行查询。当你在它上面运行len函数时,它会被评估,它会在运行过滤器后从数据库中获取所有项目以获取计数。因此,count速度非常慢。

COUNT如果您在数据库级别运行,您将获得更好的性能:

num_cities = City.objects.filter(name__iexact=city).count()

推荐阅读