函数需要太多时间来处理来自数据库的循环(3000次)

2024-09-27 01:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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包含到主查询并从主查询获取数据吗?你知道吗


Tags: 函数nametestinfoidobjdemoas
2条回答

我把所有的东西都包括进去了。现在我不需要调用函数test

cursor.execute('''SELECT (SELECT CONCAT_WS(',',id,name,eg,access) 
                from tabl_name where id=ofk.demo_id) AS result 
                ,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) # function to get data in form of dictionary
tmp_list, tmp_dict = [], {}
for res in result:
    try:
        info = res['result'].decode("utf-8").split(",") # converting res['result'] from bytes to string 
    except:    
        info = res['result'].split(",") # res['result'] is in string form
   tmp_dict['name'] = res['name']
   tmp_dict['no'] = res['no']       
   tmp_dict['data1'] = info[0] # id 
   tmp_list.append(tmp_dict.copy())

这个东西让我的代码快了10倍

您正在进行3000 db的调用(通过调用get_object_or_4043k次),这肯定会减慢速度。相反,您应该尝试通过tablemanager.filter(id__in=id_list)获取对象。在循环中准备id\u列表并将该列表传递给测试函数。你知道吗

相关问题 更多 >

    热门问题