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(withflat=Trueの) 部分とそのdistinct()部分を参照してください。確かにこれは、必要なvaluesフィールドを抽出して変換listまたはsetアプローチするよりも高速です。

その後、セットOrgIdAvailChoicesを生成difference_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 に答える