django设置操作更快还是循环?

时间:2013-02-07 07:11:44

标签: python django

以下哪项操作更快?

使用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

或使用set操作:

 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))

1 个答案:

答案 0 :(得分:4)

查看QuerySet API documentation,更确切地说是values_list部分(flat=True)和distinct()部分。当然,这将比values更快,提取您想要的字段并转换为listset方法。

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

或者,受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的正确用法(如开头所述)我的答案)会给你带来最大的加速。