如何最小化循环的时间执行?

时间:2014-02-04 11:58:13

标签: python django

我首先创建了一个包含此字典的词典列表:

navs = [{'dim': object_1, 'values': [list_of_objects_relates_to_Obj1]}]

我有一个这样的入门模型:

class Entry(models.Model):
    resp_id = models.ForeignKey('Responsibilities')
    resp_value = models.ForeignKey('JlmValues')

比计算导航列表中每个对象的相关元素的循环:

for i in navs:
    for j in i['values']:
        total = 0
        list_retrieved = Entry.filter(Q(resp_value__value_path = j.value_id) | Q(resp_value__value_path__endswith= '.' + j.value_id) | Q(resp_value__value_path__contains= '.' + j.value_id + '.') | Q(resp_value__value_path__startswith= j.value_id + '.')).values_list('resp_id__mgtper_id').distinct()
        s = datetime.now()
        total += len(Responsibilities.filter(mgtper_id_id__in=list_retrieved))  
        counter.append({'type':'value','value':j.value_name, 'total':total})
        e = datetime.now()
        print "Execution time of calculating total : "+str(e - s)

每个元素的平均时间:

Execution time of calculating total : 0:00:00.928000

我在导航中有6个词典,一个词典中的一些对象有300多个相关对象。有没有办法最小化时间执行?

1 个答案:

答案 0 :(得分:0)

这是一种可以改进它的方法。如果您未在其他地方使用此查询的结果:

total += len(Responsibilities.filter(mgtper_id_id__in=list_retrieved))

使用.count()方法而不是使用len更有效。 E.g:

total += Responsibilities.filter(mgtper_id_id__in=list_retrieved).count()

这样,它们的计数将在数据库上执行,而不是在Django实例上执行。