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")
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? –
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
Ich habe einige Details hinzugefügt. Das Problem besteht darin, das Abfrage-Set innerhalb der Schleifen zu verwenden. – msampaio