Django页面加载根据视图代码的变量本地速度减慢

时间:2014-01-30 17:28:08

标签: python django django-views

我正在使用Django来显示一系列测试结果。我创建了一个视图来显示每个测试结果的最新实例。

1: results = resultTable.objects.order_by('id')
2: latestResults = {}
3: for res in results: latestResults[res.testcase.name] = res.id
4: latestResultQuerySet = resultTable.objects.filter(id__in=latestResults.values())
5: del latestResults
6: return HttpResponse()

第1行在大约1秒内创建一个约20,000个条目的QuerySet。

第3行在大约12秒内计算每个测试用例的最新结果的id。

第4行在大约1秒钟内使用这些ID创建一个约800个条目的新QuerySet。

第5行基本上没时间删除字典。

由此我认为(空白)页面将在大约15秒内加载。在实践中,加载需要大约3分钟。

删除第3行可以立即加载页面。

任何想法是什么导致超过2分钟的延迟?由于我没有向HttpResponse传递任何内容,我认为它与字典的垃圾收集有关,因此第5行诞生了。

2 个答案:

答案 0 :(得分:1)

我的猜测是你有n + 1问题

如果是这样,当您遍历结果集时,您正在进行20,000次查询。

您可以使用select_related来避免这种情况:

results = resultTable.objects.select_related('testcase').order_by('id')

答案 1 :(得分:0)

如果我可以从您的代码中猜测逻辑,那么您正在尝试查找具有不同值testcase.name的最新ID。提高性能的唯一方法是避免从查询集在内存中构建一个庞大的字典。所以这是尝试将其变成一个简单的查询:

latestResultQuerySet = resultTable.objects.order_by('testcase__name', 'id').distinct('testcase__name')