以下哪项操作更快?
使用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))
答案 0 :(得分:4)
查看QuerySet API documentation,更确切地说是values_list
部分(flat=True
)和distinct()
部分。当然,这将比values
更快,提取您想要的字段并转换为list
或set
方法。
之后,使用QuerySet生成集合OrgIdAvailChoices
和difference_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的正确用法(如开头所述)我的答案)会给你带来最大的加速。