2017-01-24 89 views
0

我有一個Django視圖,返回數千個字符串之間編輯距離的地圖。這些字符串是MyModel類的參數。我計算了myView函數中的距離。Django多重查詢優化

我對該代碼進行了剖析並意識到循環內部的queryset會消耗大量時間。

我該如何優化?

# models.py 
class MyModel(models.Model): 
    str1 = models.CharField(max_length=300) 
    str2 = models.CharField(max_length=300) 

# views.py 
def compare(a, b): 
    return Levenshtein.distance(a, b)/max(len(a), len(b)) 

def myView(request):  
    query_set = MyModel.objects.filter(....) 
    size = query_set.count() 

    arr = numpy.zeros(size ** 2).reshape(size, size) 

    for i in range(size): 
     m1 = query_set[i].str1 
     for j in range(size): 
      m2 = query_set[j].str1 
      arr[i][j] = compare(m1, m2) 

    json_out = json.dumps({'data': arr.tolist()}) 
    return HttpResponse(json_out, content_type="application/json") 

編輯

我想是因爲我嘗試過類似的方法,但使用外部txt文件來存儲數據,這是更快的問題涉及到數據庫的訪問:

# file.txt 
[{'par1': ....}, {'par1': ....}, ...] 

# views.py 
def myView(request): 
    with open('file.txt', 'r') as out: 
     data = out.read() 
    size = len(data) 

    arr = numpy.zeros(size ** 2).reshape(size, size) 

    for i in range(size): 
     for j in range(size): 
      m1 = data[i]['par1'] 
      m2 = data[j]['par1'] 
      arr[i][j] = compare(m1, m2) 

    json_out = json.dumps({'data': arr.tolist()}) 
    return HttpResponse(json_out, content_type="application/json") 
+0

我不認爲你在這裏有足夠的細節(並且似乎還有一堆無關細節)。 query_set/filter行緩慢嗎?如果是這樣的查詢?如果不是,查詢中哪裏的速度很慢? –

+0

同意這需要更多信息。我不認爲查詢集是問題,我認爲這是你的嵌入式列表迭代。或者,也許這是您的比較算法... – rob

+0

我添加了一些細節。問題是在循環內使用queryset。 – msampaio

回答