2017-01-24 2 views
0

Ich habe eine Django-Ansicht, die eine Karte der Bearbeitungsabstand zwischen Tausenden von Zeichenfolgen zurückgeben. Diese Zeichenfolgen sind Argumente der Klasse MyModel. Ich berechne den Abstand in der myView Funktion.Django multiple Abfragen Optimierung

Ich profilierte diesen Code und erkannte, dass die queryset innerhalb der Schleife eine Menge Zeit verbraucht.

Wie könnte ich das optimieren?

# 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") 

EDIT

denke ich, das Problem mit dem Zugriff auf die Datenbank verwandt ist, weil ich einen ähnlichen Ansatz versucht, aber mit einem externen txt-Datei, die Daten zu speichern, und es war viel schneller:

# 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

Ich glaube nicht, dass Sie hier genug Details haben (und es scheint auch eine Reihe von nicht verwandten Details zu geben). Ist die Zeile query_set/filter langsam? Wenn ja, was die Abfrage? Wenn nicht, wo in der Abfrage ist es langsam? –

+0

Vereinbarte dies benötigt mehr Informationen. Ich denke nicht, dass das Abfrage-Set das Problem ist, ich denke, es ist Ihre eingebettete Listen-Iteration. Oder, vielleicht ist es Ihr Vergleichsalgorithmus ... – rob

+0

Ich habe einige Details hinzugefügt. Das Problem besteht darin, das Abfrage-Set innerhalb der Schleifen zu verwenden. – msampaio

Antwort