Aight,基本上,我有一个看起来像这样的数据库:
id | parentid | type | name
---------------------------------------------
1 | 0 | heading | this is my heading
---------------------------------------------
2 | 1 | child | this is one of many child elements
我正在使用Mako浏览数据列表并创建嵌套的UL。它看起来效果很好......但我不确定我的代码是否可以改进。
这是:
<%def name="getCategories(parentID)">
## This function creates the children LI for the main headings
## Parameters:
## parentID - Integer - ID of the heading you want to get the children for
<%
categories = [x for x in c.headings if x.type == 'category' and x.parentid == parentID]
categories.sort(key=lambda x: x.name)
%>
%for category in categories:
<li>
<ul>
<li>${category.name.title()}</li>
${getSubCategories(category.id)}
</ul>
</li>
%endfor
<%def name="getSubCategories(parentID)">
## Get the subcategories for the parent category
##
## This could eventually turn into a recursive function to get further subcategories
## which is why it has it's own function rather than just having another for loop above
##
## Parameters: Same as above
<%
categories = [x for x in c.headings if x.type == 'category' and x.parentid == parentID]
categories.sort(key=lambda x: x.name)
%>
%for category in categories:
<ul>
<li>${category.name.title()}</li>
</ul>
%endfor
</%def>
</%def>
如果你想知道为什么我有两个产生相同输出的函数,那是因为它们没有。从getSubCategories()生成的嵌套UL的样式与从getCategories()生成的样式不同(HTML)。
这慢吗?它会在重载下死掉吗?可以改进吗?
我很感激你的建议。欢呼声。
答案 0 :(得分:1)
首先,没有办法知道它是否会在没有测试的情况下在重载下死亡。你诚实地提问的唯一方法是profile你的代码。只有你能做到。
现在,嵌套关系总是很慢,但你似乎只使用2级嵌套,因此它是O(n ^ 2),没有什么可以远程杀死服务器。
改善它的一些方法: