0

以下哪个操作更快?

使用 for 循环:

 OrgIdChoices = []
 Orgid_used_choices = [(choice["organization_id"])for choice in list(Organization.objects.all().values("organization_id"))]   #Gets used ID's
 OrgIdAvailChoices  = [ "%c%c" % (x, y) for x in range(ord('A'), ord('Z')+1) for y in range(ord('A'), ord('Z')+1)]  #Gets available ID's
 for i in OrgIdAvailChoices:
      if not i in Orgid_used_choices:
          OrgIdChoices.append((i,i))   #Generates OrgIdAvailChoices which are not in Orgid_used_choices

或使用集合操作:

 OrgIdChoices = []
 Orgid_used_choices = set([(choice["organization_id"])for choice in list(Organization.objects.all().values("organization_id"))])
 OrgIdAvailChoices  = set([ "%c%c" % (x, y) for x in range(ord('A'), ord('Z')+1) for y in range(ord('A'), ord('Z')+1)])
 OrgChoices = OrgIdAvailChoices - Orgid_used_choices
 for i in OrgChoices:
     OrgIdChoices.append((i,i))
4

1 回答 1

4

查看QuerySet API 文档,更准确地说是values_list部分 (with flat=True) 和distinct()部分。当然,这会比values提取您想要的字段并转换为listset接近的速度更快。

之后,生成集合OrgIdAvailChoicesdifference_update使用 QuerySet 的简单方法应该比您建议的方法快得多。

或者,受 Pannu 评论的启发,采用以下方法itertools

import itertools
import string

filter(
    lambda x: x not in OrgIdAvailChoices,
    [''.join(el) for el in itertools.combinations_with_replacement(string.ascii_uppercase, 2)]
)

说实话,我不确定是否QuerySet实际上是一个集合,也就是说,如果其中的搜索是对数的,但根据我的经验判断,正确使用 Django 的 ORM(如我的回答开头所述)将为您带来最大的加速。

于 2013-02-07T08:12:02.477 回答