作者gbllggi (gbllggi)
看板Python
标题[问题] Django html table
时间Fri Feb 26 12:45:13 2016
大家好
其实不太确定这问题适不适合在这边问,
如果有更适合的板请指引一下,谢谢
我最近用Django写了一个小网站,
其中有个html table会依据使用者不同的选择
产出资料(我用list) 然後跑个for loop把资料放进表格里
{% for label in results %}
<tr ><td >{{ label}}</td>
{% endfor %}
但效率实在是很差,当我的list有超过三千个items时
就要等个五六秒网页才开得出来
偏偏有很多时候我的list可能会有超过两三万个结果
一开始我以为是我在产出资料的function效率太差
不过测试了一下最糟的情况也只需要零点八秒,目前也在想办法把这个搜寻时间减短
所以我想问题应该是出在用for loop把资料放进表格里太慢
想请问有没有什麽比较有效率的方法可以populate the table?
还是其实问题不是出在这边?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 71.190.252.2
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1456461962.A.12F.html
1F:→ Neisseria: 可以用浏览器的 developer tools 看那段程式最花时间 02/26 15:07
2F:推 Falldog: 用django debug toolbar看看吧 说不定是query太多次 02/26 16:22
3F:推 stupidgod08: 建议分页或cache或配合api用javascript生成 02/26 16:55
4F:→ uranusjr: Django Template 的 for loop 确实有可能有效能问题 02/26 18:13
5F:→ uranusjr: 可以改用 simple tag 直接用 Python 产出 table content 02/26 18:13
7F:推 icycandle: ajax & js render +1 只是这样就不好用 debugtoolbar 02/28 16:36
更新:
依 uranusjr 大的建议,我用 simple tag 把 loop 拉回 python跑
在 html 中把 for loop 改成:
<table>
{% autoescape off %} {% populate_table results%}{% endautoescape %}
</table>
然後 register.simple_tag 的内容就类似 uranusjr 大提供的范例。
但测试之後发现结果还是不是很令人满意,
len(list) simple tag | for loop in html
--------------|------------|-------------------
15 | < 4.5s | < 2.5s
--------------|------------|-------------------
150 | < 4.5s | < 2.5s
--------------|------------|-------------------
2,500 | < 5s | < 4.5s
--------------|------------|-------------------
260,000 | < 1.2 min | about 2.8 min
--------------|------------|-------------------
也就是说在有超级长的 list 时,simple tag 效能确实好很多,
但是就算 list 内容很少的时候,还是必须花到四秒钟以上,
完全比不上原本的方法的效能,这实在让我很困扰@@
不知道各位还有没有什麽其它建议?
谢谢
※ 编辑: gbllggi (108.58.165.58), 03/09/2016 05:18:43
8F:→ uranusjr: 因为解析 simple tag 需要 load external register, 会 03/12 14:50
9F:→ uranusjr: 对 startup time 有影响, 如果仍然不能接受就只能拉到 03/12 14:50
10F:→ uranusjr: view 里面做, 或者改用 Jinja2 来处理这个 template 了 03/12 14:50