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

Python 如何减少长模板渲染时间?,python,django,optimization,Python,Django,Optimization,我正在尝试优化视图模板渲染。此刻我有了这样的画面: 如您所见: SQL计时持续时间~0.5秒, 模板计时~2sec, 但是总时间几乎是9秒 我的视图中还有一个计时器-它显示视图工作的~0.6秒。当视图打印“Finished”(完成)后,当我在浏览器中看到此页面渲染完成时,这会花费很多时间 有人能解释一下额外的9-0.5-2-0.6=5.9秒是从哪里来的吗? 我有一个相当长的列表要呈现,带有分页,~12k个项目。如果项目数量较小,则渲染时间也较小。有时,我也会使用20k个项目的列表呈现此页面,但

我正在尝试优化视图模板渲染。此刻我有了这样的画面:

如您所见:
SQL计时持续时间~0.5秒
模板计时
~2sec,
但是
总时间
几乎是9秒
我的视图中还有一个计时器-它显示视图工作的~0.6秒。当视图打印“Finished”(完成)后,当我在浏览器中看到此页面渲染完成时,这会花费很多时间

有人能解释一下额外的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列表,如果未找到缓存,它将直接过滤产品表。但是如果我删除缓存条件,速度会显著降低,几乎是图片2的2倍。为什么会发生这种情况?我发现,当我使用缓存时,
SQL计时
比使用标准筛选时低
,但是
总计时
比使用标准筛选时长两倍!我正在努力实现更好的东西,但是得到更坏的结果。

Django的缓存为你的问题提供了很好的解决方案。你是说缓存部分模板吗?考虑用JavaScript在浏览器上渲染页面,这样你只能从WebSaHAF发送数据(JSON),你有没有链接到有用的资源该怎么办?目前我对JavaScript有一点经验。请参见此处如何缓存html模板