在使用Django QuerySets时使用列表解析而不是for循环

moh*_*666 2 python django list-comprehension list django-queryset

我正在尝试调整速度部门遇到的应用程序.因此,我已经开始将所有for-loop语句转换为列表推导.

目前,我正在研究一个需要遍历Django查询集字典的函数.旧代码使用for循环语句来迭代这个并且它工作正常.我使用列表推导的代码返回django查询集而不是我的模型对象.

这是代码:

def get_children(parent):
  # The following works
  children = []
  for value in get_data_map(parent).itervalues():
    children += list(value)
  # This part doesn't work as intended.
  booms = [value for value in get_data_map(parent).itervalues() if value]
  import pdb
  pdb.set_trace()


(Pdb) type(children[0])
<class 'site.myapp.models.Children'>

(Pdb) type(booms[0])
<class 'django.db.models.query.QuerySet'>
Run Code Online (Sandbox Code Playgroud)

请注意,get_data_map返回值为的字典 <class 'django.db.models.query.QuerySet'>

这部分代码是应用程序中最耗时的部分之一.如果我将这个工作放在列表推导上,那么应用程序的速度有望提高两倍.

知道如何加快这部分代码的速度吗?

Mik*_*one 5

你的问题不是for循环与列表理解(更好的是生成器).您的问题是对数据库的查询过多.

由于您尝试获取一个列表,因此您应该尝试从一个查询中获取它.如果您解释了典型QuerySet中的内容,我们可以向您展示如何最好地合并它们.也许OR在Q对象上使用合并.或者可能构建一组整数并将其提供给__in=过滤器.