我的表现很差

2024-05-23 14:25:11 发布

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

我的代码有性能问题。我对Python有点陌生,想不出更好的方法来编写下面的代码。你知道吗

我有一个外部数据库,其中有一个名为“cdr”的表,它不是django项目的一部分,我需要对这些行进行一些计算。为了得到变量的值,我对cdr表中的每一行进行了查询,这使得我的代码非常慢。你知道吗

这是我的班级视图.py你知道吗

def cdr_adm(request):
        cursor = connections['cdr'].cursor()
        cursor.execute("SELECT calldate, dst, billsec, accountcode, disposition, userfield FROM cdr where calldate >= '%s' and calldate < '%s' and disposition like '%s' and accountcode like '%s' and dst like '%s' and userfield like '%s'" %(start_date, end_date, status, customer, destino, provider))
        result = cursor.fetchall()
        time = 0
        price = 0
        price_prov = 0
        count = 0
        time_now = 0
        ANS = 0
        asr = 0
        rate_cust = 0
        rate_prov = 0

        for call in result:
                if call[3]:
                        #These 2 lines are the problem - It's very slow to run for all rows.
                        rate_cust = User.objects.get(username = call[3])
                        rate_prov = Provider.objects.get(name = call[5])
                        time_now = call[2] / 60
                        time =  time + time_now
                        count = count + 1
                        price = price + (float(rate_cust.first_name) * time_now)
                        price_prov = price_prov + (float(rate_prov.rate) * time_now)
                        if call[4] == "ANSWERED":
                                ANS = ANS + 1
        time = float(time)
        lucro = price - price_prov
        lucro = float(lucro)
        if count > 0:
                asr = (ANS / count)  * 100
        return render_to_response("cdr_all.html",
                {'calls':result,'price':price,'time':time,'count':count,'customers':customers, 'providers':providers,'price_prov':price_prov, 'lucro':lucro, 'asr':asr }, context_instance=RequestContext(request))

我在考虑编一本字典并在里面搜索,但我也不确定。你知道吗


Tags: andratetimecountcallfloatasrprice
1条回答
网友
1楼 · 发布于 2024-05-23 14:25:11

您可以创建一个包含所有UserProvider对象的字典,按照您感兴趣的内容进行索引,如下所示:

users = dict([(u.username, u) for u in User.objects.all()])
providers = dict([(p.name, p) for p in Provider.objects.all()])

(请确保在for call in result:for循环之外执行此操作!)然后可以将慢速查询更改为:

                    rate_cust = users[call[3]]
                    rate_prov = provided[call[5]]

我猜用户和提供者要比调用少得多,这意味着将它们保存在字典中要比为每个调用进行一个查询快得多。你知道吗

相关问题 更多 >