【发布时间】:2011-10-06 13:28:40
【问题描述】:
我正在尝试调整一个在速度部门遇到问题的应用程序。因此,我已开始尽可能将所有 for 循环语句转换为列表推导式。
目前,我正在研究一个需要遍历 Django 查询集字典的函数。旧代码使用 for-loop 语句来迭代它并且它工作正常。我使用列表理解的代码返回 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'>
注意 get_data_map 返回一个字典,其值为<class 'django.db.models.query.QuerySet'>
这部分代码是应用程序中最耗时的部分之一。如果我在列表推导上进行这项工作,应用程序速度有望提高两倍。
知道如何加快这部分代码的速度吗?
【问题讨论】:
-
是什么让您认为列表解析比执行常规
for ... in ...循环更快? -
我对生成器、列表推导、for 循环和 map 做了一个简单的测试,列表推导比 for .. 循环快了将近两倍。
标签: python django list list-comprehension django-queryset