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")
我不认为你在这里有足够的细节(并且似乎还有一堆无关细节)。 query_set/filter行缓慢吗?如果是这样的查询?如果不是,查询中哪里的速度很慢? –
同意这需要更多信息。我不认为查询集是问题,我认为这是你的嵌入式列表迭代。或者,也许这是您的比较算法... – rob
我添加了一些细节。问题是在循环内使用queryset。 – msampaio