我有一个函数可以跨多个对象执行大量数据库查询:
def some_func(user):
group1 = user.manytomanyfield1.all()
allinstances = []
for item in group1:
allinstances += group1.manytomanyfield2.all()
然后我有一个列表“allinstances”,它是由对象组成的。然后,我需要检查创建的“allinstances”列表中是否有具有“name”属性的对象,该属性在“allinstances”列表中的某些数量的对象中是相同的,并删除重复项:
^{pr2}$当allinstances的大小很小时,函数执行得非常快。但是我的应用程序范围是这样的,它通常可以处理数万到几十万个'object1'的数量,所以'allinstances'列表会很大,所以函数的执行需要很长一段时间。目前在'allinstances'中有~25000'object1,函数执行需要10秒。这对我来说是无法承受的,因为返回的列表进一步放入Paginator中,并且包含object1详细信息的Listview是根据结果构造的,因此用户必须等待函数执行。在
我认为有以下几种方法可以减少这一瓶颈: 1优化函数执行速度 2更改我的视图以使用AJAX,并将函数执行重新路由到类似celeri的异步任务队列。然后页面上的AJAX以一定的时间间隔查询结果,当任务完成时,将结果添加到页面上。在
在这种情况下有什么最佳做法吗? 也许还有其他更可行的解决方案? 欢迎提出任何代码改进建议。在
我认为很多性能问题都是由于Django在拥有大量记录时不得不运行大约25000个查询造成的。在
prefetch_related是我在这里使用的。在
代码的第一部分如下所示:
一个非常快速的优化是使
names
成为一个集合,因为列表查找是线性的(O(n)),而集合查找是常量(O(1)):相关问题 更多 >
编程相关推荐