Python - Эффективен ли мой код? Или люди будут веселиться, убивая мой сервер ...? - PullRequest
2 голосов
/ 10 августа 2010

Хорошо, в принципе, у меня есть база данных, которая выглядит так:

id | parentid | type    | name
---------------------------------------------
 1 |   0      | heading | this is my heading
---------------------------------------------
 2 |   1      | child   | this is one of many child elements

Я использую Мако, чтобы просмотреть этот список данных и создать вложенные 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>

Если вам интересно, почему у меня две функции, которые выдают одинаковый вывод, это потому, что они этого не делают. Вложенные UL, созданные с помощью getSubCategories (), имеют другой стиль (HTML), чем те, которые создаются с помощью getCategories ().

Это медленно? Он умрет под тяжелой нагрузкой? Можно ли это улучшить?

Буду признателен за ваш совет. Приветствия.

1 Ответ

1 голос
/ 10 августа 2010

Во-первых, нет способа узнать, умрет ли он при большой нагрузке, не протестировав его.Честно говоря, единственный способ ответить на ваш вопрос - профиль вашего кода.Только вы можете сделать это.

Теперь вложенные отношения всегда медленные, но вы, похоже, используете только 2 уровня вложенности, поэтому это O (n ^ 2), ничего, что могло бы уничтожить сервер удаленно.

Некоторые способы улучшить его:

  • Удалите это сочетание кода и разметки.Это действительно трудно читать и, вероятно, так же трудно отлаживать.Я знаю, что Мако достаточно гибок, чтобы позволить тебе это делать, но не потому, что ты можешь, а должен.Попробуйте MVC .
  • Если он обнаруживает себя медленным, то исследуйте альтернативы, такие как таблицы закрытия .Но поскольку вы просто отображаете дерево, оно может вообще не иметь никакого влияния.В лучшем случае вы можете ускорить сортировку.
  • Говоря о сортировке, попробуйте сортировать и фильтровать категории при запросе к базе данных, а не в коде.Это лучше, чем вы.
  • Или, если вы этого не сделаете, сделайте хотя бы один цикл для генерации обоих списков.Фильтрация одинаковая, нет необходимости проходить через все элементы дважды.
  • Я думаю, ваши категории не будут меняться при каждой загрузке страницы.Кэшируйте это.
...