Python - 我的代码有效吗?或者人们会玩得开心杀死我的服务器......?

时间:2010-08-10 04:11:40

标签: python templates performance pylons

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)。

这慢吗?它会在重载下死掉吗?可以改进吗?

我很感激你的建议。欢呼声。

1 个答案:

答案 0 :(得分:1)

首先,没有办法知道它是否会在没有测试的情况下在重载下死亡。你诚实地提问的唯一方法是profile你的代码。只有你能做到。

现在,嵌套关系总是很慢,但你似乎只使用2级嵌套,因此它是O(n ^ 2),没有什么可以远程杀死服务器。

改善它的一些方法:

  • 删除代码和标记之间的混合。它真的很难阅读,可能很难调试。我知道Mako足够灵活,可以让你这样做,但这不是因为你可以,你应该这样做。试试一些MVC
  • 如果它表明自己很慢,那么请探索closure tables之类的替代方案。但是,由于您只是显示树,它可能根本没有影响。你最多可以加快排序速度。
  • 谈到排序,在查询数据库时尝试排序和过滤类别,而不是在代码中。做这件事比你好。
  • 或者如果不这样做,至少只生成一个循环来生成两个列表。过滤是一样的,不需要两次通过所有项目。
  • 我猜你的类别在每次加载页面时都不会改变。缓存它。