如何加快Django中大型数据集的迭代速度

7 投票
4 回答
5697 浏览
提问于 2025-04-16 15:41

我有大约1500条记录是通过Django的ORM查询得到的。我使用了select_related()和only()这两个方法,确保查询的效率很高。同时,我还用connection.queries来确认只执行了这一条查询。也就是说,我确保在每次循环时没有多余的查询被调用。

当我从connection.queries中复制并运行这个查询时,它只花了0.02秒。然而,当我遍历这些记录并且什么都不做(只是跳过它们)时,却花了七秒钟。

我该怎么做才能加快这个过程?是什么导致了这个慢速呢?

4 个回答

2

你是怎么遍历每一个项目的:

items = SomeModel.objects.all()

用普通的for循环遍历每一个

for item in items:
    print item

或者使用QuerySet的迭代器

for item in items.iterator():
    print item

根据文档,iterator()可以提高性能。当你在处理非常大的Python列表或字典时,最好使用iteritems()

3

1500条记录远算不上一个大数据集,而七秒钟的时间确实太长了。你的模型可能存在一些问题。你可以很简单地检查一下,按照Brandon说的,先获取values()查询的结果,然后通过遍历字典来明确创建这1500个对象。在构建对象之前,先把ValuesQuerySet转换成一个列表,这样可以减少数据库连接的影响。

16

当一个查询集里装满了很多模型对象时,它可能会变得很庞大。在这种情况下,我通常会使用查询集的 .values 方法,这样可以只提取我需要的属性,并把它们放在一个字典列表里,这样遍历起来会快很多。

Django 文档:values_list

撰写回答