【问题标题】:Django multiple queries optimizationDjango 多查询优化
【发布时间】:2017-01-24 00:56:00
【问题描述】:

我有一个 Django 视图,它返回数千个字符串之间的编辑距离图。这些字符串是MyModel 类的参数。我在myView 函数中计算距离。

我分析了这段代码,发现循环内的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/ 过滤器线慢吗?如果是这样,查询是什么?如果不是,查询在哪里变慢了?
  • 同意这需要更多信息。我认为查询集不是问题,我认为这是您的嵌入式列表迭代。或者,也许是你的比较算法……
  • 我添加了一些细节。问题是在循环中使用查询集。

标签: python django django-queryset


【解决方案1】:

myView 实际执行了多少次查询?它应该为 count() 做 1 - 或可能为 2,然后是实际数据。但我会先验证这一点。我使用https://github.com/dobarkod/django-queryinspect,但大多数人使用https://github.com/jazzband/django-debug-toolbar 来了解正在执行多少查询。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2011-10-08
    • 2012-03-19
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多