2017-01-24 19 views
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") 
+0

私はあなたがここで十分な詳細を持っているとは思わない(そして、無関係の詳細もたくさんあるようです)。 query_set/filter行は遅いですか?もしそうなら、どのようなクエリですか?そうでない場合は、クエリのどこが遅いのですか? –

+0

これは、より多くの情報を必要とする合意した。私はクエリーセットが問題だとは思わない、私はあなたの埋め込みリストの反復だと思う。または、おそらくそれはあなたの比較アルゴリズムです... – rob

+0

私はいくつかの詳細を追加しました。問題は、ループ内でクエリーセットを使用することです。 – msampaio

答えて