我目前正在我的一个项目中优化我的一些代码,并发现一些非常慢的代码。我有一个通过Django查询获得的对象列表。我想过滤此列表并仅返回一个对象,因为值是唯一的。
questions = set(Question.object.all())
choices = set(Choice.objects.select_related('question').filter(question__in=questions).all())
for question in questions:
Answer(question=question,
choice=next(filter(lambda x: x.question == question), choices)),
response=response)
其中一些只是伪代码,但真正的问题在于next()函数。有没有更快的方法来查找集合中的元素?使用列表推导是不可能的,因为它解析整个列表然后返回所有元素。 Filter是一个生成器,next()返回它找到的第一个值。
我正在使用Django 1.7和Python 3.4
谢谢!
答案 0 :(得分:1)
我不会在这里使用集合,而是使用由问题ID键入的字典。 (注意,您实际上并不需要问题,因此可以删除select_related。)
choice_dict = {c.question_id: c for c in Choice.objects.filter(question__in=questions).all()}
for question in questions:
Answer(question=question,
choice=choice_dict[question.id],
response=response)