Как я могу оптимизировать этот код Google App Engine? - PullRequest
5 голосов
/ 30 октября 2008

Я относительно новичок в мире питонов, но это кажется очень простым.

Google кричит мне, что этот код нужно оптимизировать:

class AddLinks(webapp.RequestHandler):
     def post(self):
          # Hash the textarea input to generate pseudo-unique value
          hash = md5.new(self.request.get('links')).hexdigest()

          # Seperate the input by line
          allLinks = self.request.get('links').splitlines()

          # For each line in the input, add to the database
          for x in allLinks:
               newGroup = LinkGrouping()
               newGroup.reference = hash
               newGroup.link = x
               newGroup.put()

          # testing vs live
          #baseURL = 'http://localhost:8080'
          baseURL = 'http://linkabyss.appspot.com'

          # Build template parameters
          template_values = {
               'all_links': allLinks,
               'base_url': baseURL,
               'reference': hash,
          }

          # Output the template
          path = os.path.join(os.path.dirname(__file__), 'addLinks.html')
          self.response.out.write(template.render(path, template_values))   

Приборная панель сообщает, что используется тонна процессора.

Где искать улучшения?

Ответы [ 6 ]

7 голосов
/ 30 октября 2008

Основными накладными расходами здесь являются множественные индивидуальные посылки в хранилище данных. Если вы можете, сохраните ссылки как единое целое, как предлагает Андре. Вы всегда можете разбить ссылки на массив и сохранить их в ListProperty.

Если вам нужна сущность для каждой ссылки, попробуйте следующее:

# For each line in the input, add to the database
groups = []
for x in allLinks:
     newGroup = LinkGrouping()
     newGroup.reference = hash
     newGroup.link = x
     groups.append(newGroup)
db.put(groups)

Это уменьшит количество обращений к хранилищу данных до одного, и именно это действительно убивает вашу высокую загрузку ЦП.

3 голосов
/ 30 октября 2008

выглядит довольно плотно для меня.

Я вижу одну вещь, которая может сделать небольшое улучшение. Ваш звонок "self.request.get ('links')" дважды.

Итак, добавив:

unsplitlinks = self.request.get('links')

И ссылки "unsplitlinks" могут помочь.

Кроме того, цикл является единственной областью, которую я вижу, которая будет целью для оптимизации Можно ли подготовить данные и сразу добавить их в базу данных вместо того, чтобы делать добавление базы данных по ссылке? (Я предполагаю, что команда .put () добавляет ссылку на базу данных)

2 голосов
/ 30 октября 2008

Вы можете значительно сократить взаимодействие между вашим приложением и базой данных, просто сохранив полный текст self.request.get('links') в текстовом поле в базе данных.

  • только один put() за post(self)
  • хэш не сохраняется n раз (для каждой ссылки, которая не имеет смысла и действительно является пустой тратой пространства)

И вы спасаете себя от разбора текстового поля, когда кто-то фактически вызывает страницу ....

0 голосов
/ 05 ноября 2008

нет / вы не можете использовать что-то вроде "links.contains ('http://www.google.com')" GQL не поддерживает это

0 голосов
/ 30 октября 2008

Могу ли я запросить у ListProperty?

Что-то вроде

SELECT * FROM LinkGrouping WHERE links.contains('http://www.google.com')

У меня есть планы на будущее, где мне понадобятся эти функции.

Я определенно реализую единственный db.put () для сокращения использования.

0 голосов
/ 30 октября 2008

Как часто это называют? Это выглядит не так уж плохо ... особенно после удаления дублирующего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...