我有一个来自Django ORM查询的大约1500条记录的查询集。我使用了select_related()和only()方法来确保查询是紧凑的。我还使用了connection.queries来确保只有一个查询。也就是说,我已经确保不会在每次迭代中调用额外的查询。
当我从connection.queries运行剪切和粘贴查询时,它在0.02秒内运行。但是,迭代这些记录需要7秒钟,并且不对它们做任何操作(pass)。
我能做些什么来加快速度呢?是什么导致了这种缓慢?
发布于 2011-04-14 06:09:16
当QuerySet中充满了模型对象时,它会变得非常笨重。在类似的情况下,我在查询集上使用了.values方法,将我需要的属性指定为字典列表,这样迭代起来会快得多。http://docs.djangoproject.com/en/1.3/ref/models/querysets/#values-list
发布于 2011-04-14 07:03:51
1500条记录远远不是一个大的数据集,7秒真的太多了。您的模型中可能存在一些问题,您可以通过获取(正如Brandon所说的) values()查询来轻松地检查它,然后通过迭代字典显式地创建1500对象。只需在构造之前将ValuesQuerySet转换为一个列表,即可排除db连接。
发布于 2011-04-14 07:54:16
你是如何迭代每一项的:
items = SomeModel.objects.all()each上的常规for循环
for item in items:
print item或使用QuerySet iterator
for item in items.iterator():
print item根据文档,iterator()可以提高性能。这同样适用于循环非常大的Python列表或字典,最好使用iteritems()。
https://stackoverflow.com/questions/5656238
复制相似问题