0
数千の文字列間の編集距離のマップを返すDjangoビューがあります。これらの文字列は、MyModel
クラスの引数です。私はmyView
関数で距離を計算します。Django複数のクエリの最適化
私はこのコードをプロファイルし、ループ内のqueryset
が多くの時間を消費することを認識しました。
これをどのように最適化できますか?
:EDIT# 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
私はいくつかの詳細を追加しました。問題は、ループ内でクエリーセットを使用することです。 – msampaio