如何减少长模板渲染时间?

时间:2018-04-27 16:25:16

标签: python django optimization

我正在尝试优化视图模板渲染。此刻我有这样的图片:
enter image description here
如你所见:
 SQL timing持续 ~0.5秒
 TemplateTiming ~2秒
 但是Total Time 差不多9秒! 此外,我的视图中有一个计时器 - 它显示视图工作的 ~0.6秒。当视图打印出“已完成”时 - 在我看到此页面渲染在浏览器中完成后会花费很多时间。

 有人可以解释我从哪里到9-0.5-2-0.6 = 5.9秒来自哪里?

我有很长的列表要渲染,分页,~12k项目。如果项目数量较小 - 渲染时间也较短。有时我也会使用~20k项目列表呈现此页面,但使用另一个查询/过滤器组合 - 总时间要小得多~4~5秒。出了什么问题,什么时候出现?

更新看起来我已经找到问题的原因,但我仍然无法得到错误。我认为我有这段代码:

 #1st definition of products_list
products_list = Product.objects.select_related('shop', 'brand', 'sale', 'promo', 'category') \
                                    .only('product_id', 'title', 'slug', 'product_url',
                                          'price', 'prev_price', 'brand',
                                          'sale__percent', 'sale__old_price',
                                          'promo__promo_description', 'promo__promo_url',
                                          'shop__shop_name', 'shop__country',
                                          'category__category_name')\
                                    .filter(in_stock = True)
      if sale != None:
            cached_shop = cache.get(shop)
            if cached_shop != None:
                #2nd definition, replaces products_list
                products_list = Product.objects.select_related('shop', 'brand', 'sale', 'promo', 'category').filter(product_id__in=cached_shop[sale])                          #PRODUCS_LIST
            else:
                #this piece of code uses 1st definition of products_list
                if sale == "19%":
                    products_list = products_list.filter(sale__percent__gt=0, sale__percent__lt=20)
                elif sale == "20%-49%":
                    products_list = products_list.filter(sale__percent__gte=20, sale__percent__lt=50)
                elif sale == "50%-69%":
                    products_list = products_list.filter(sale__percent__gte=50, sale__percent__lt=70)
                elif sale == "70%-89%":
                    products_list = products_list.filter(sale__percent__gte=70, sale__percent__lt=90)
                elif sale == "90%+":
                    products_list = products_list.filter(sale__percent__gte=90)

如您所见,它试图在缓存中找到product.id列表,如果找不到缓存 - 它会直接过滤Product表。但是如果我删除缓存条件 - 速度会急剧下降,几乎是2倍 - 图2
enter image description here
为什么会这样?我看到,当我使用缓存时,SQL timings 更低比使用标准过滤时,但Total timings 2倍!我正在努力实现更好的事情,但结果会更糟。

0 个答案:

没有答案