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模板