我在3000次循环中调用一个函数。我正在调用该函数并从该函数获取一些字典,但这需要时间。我正在从数据库中获取数据,这给了我大约3000行,并且正在循环这些行并在该循环中调用函数,该循环从数据库中获取数据并返回字典,但这需要时间。

码:

def test(request, uni_id):
    try:
        Obj = get_object_or_404(tabl_name, id=uni_id)
    except:
        Obj = None

    dict = {}
    if Obj:outlet_info
        dict['data1'] = Obj.id
        dict['data2'] = Obj.name
        dict['data3'] = Obj.eg
        dict['data4'] = Obj.access

    return dict


cursor.execute('''SELECT cd.name, cd.no,ofk.demo_id
                    FROM `main_table` as myo
                    LEFT JOIN `table1` as emt ON emt.some_id = myo.some1_id
                    LEFT JOIN `table2` as ofk ON ofk.id = myo.kit_id
                    LEFT JOIN `table3` as cd ON cd.eg_id = myo.eg_id
                    WHERE emt.type='test''''

result = dictfetchall(cursor)
tmp_list, tmp_dict = [], {}
for res in result:
   tmp_dict['name'] = res['name']
   tmp_dict['no'] = res['no']
   info = test(request,res['demo_id'])
   tmp_dict['data1'] = info['data1']
   tmp_list.append(tmp_dict.copy())


在这里,我从查询中获取demo_id并将其传递给使用函数test来获取数据的另一个查询,因此这花费了太多时间。

谁能告诉我如何提高速度或在主查询中包含demo_id并从主查询中获取数据?

最佳答案

您正在进行3000次db调用(通过调用get_object_or_404 3k次),这肯定会变慢。相反,您应该尝试通过tablemanager.filter(id__in=id_list)获取对象。循环准备id_list并将该列表传递给您的测试函数。

10-07 12:35
查看更多