Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何最小化循环的执行时间?_Python_Django - Fatal编程技术网

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

Python 如何最小化循环的执行时间?,python,django,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') 而不是计算导航列表中每个对象的

我首先创建了一个包含以下内容的词典列表:

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

我在navs中有6个字典,一个字典中的一些对象有300多个相关对象。有什么方法可以减少执行时间吗?

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

total+=len(responsibility.filter(mgtper\u id\u id\u in=list\u retrieved))

使用
.count()
方法比使用
len
更有效。例如:

total+=responsibility.filter(mgtper\u id\u id\u in=list\u retrieved)。count()


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

几乎与计算总计的执行时间相同:0:00:00.913000然后我将尝试优化数据库(添加索引,查看带有子查询的手动选择是否可以加快速度,等等),正如你所说的那样,你在Django做了正确的事情。