Синтаксический анализ данных моего API с BeautifulSoup4 и python слишком медленный - PullRequest
0 голосов
/ 13 мая 2018

Я сделал API, анализирующий данные вклада GITHUB для каждой учетной записи и упорядочивающий по месяцам, неделям или дням и оформляющий с помощью JSON.

Ответ на один запрос занимает примерно 2 секунды.(1800 мс)

Ссылка на мой репозиторий GitHub.

contributions.py в репозитории - это код Python, выполняющий вышеуказанные действия.

ТОЧКАВОПРОС: Что делает мой API медленным?

слишком много данных для анализа (около 365)?как API делает строку JSON?

Спасибо, что ответили и помогли мне заранее.

1 Ответ

0 голосов
/ 13 мая 2018

"Почему мой код работает медленно?"это действительно сложный вопрос.Там в основном неограниченное количество возможных причин, которые могут быть.Возможно, я не смогу ответить на вопрос, но я могу дать некоторые предложения, которые, надеюсь, помогут вам ответить на него.

Есть десятки вопросов, которые нужно задать ... Какое оборудование вы используете?Какая сеть / интернет у вас есть?Это просто медленно на первый запрос или все запросы?Это просто медленный вызов на один тип запроса (ежедневно, еженедельно, ежемесячно) или все?и т. д.

Вы указываете, что общее время запроса составляет ~ 1800 мс, но, как вы указали, во время обработки этого запроса происходит много вещей.По моему опыту, часто один из лучших способов выяснить это добавить код синхронизации, чтобы сузить область медлительности.

Например, один быстрый и грязный способ сделать это - использоватьмодуль времени Python.Я быстро добавил некоторый код в метод еженедельных взносов:

  import time

  # [...]

  @app.route("/contributions/weekly/<uname>")
  def contributionsWeekly(uname):
    before = time.time()
    rects = getContributionsElement(uname)
    after = time.time()
    timeToGetContribs = after - before

  # [...]

  print(' timeToGetContribs: ' + str(timeToGetContribs))
  print('timeToIterateRects: ' + str(timeToIterateRects))
  print('   timeToBuildJson: ' + str(timeToBuildJson))

Запуск этого кода локально дал следующие результаты:

 timeToGetContribs: 0.8678717613220215
timeToIterateRects: 0.011543750762939453
   timeToBuildJson: 1.5020370483398438e-05

(Обратите внимание на e-05 в конце последнеговремя ... очень небольшое количество времени).

Из этих результатов мы знаем, что время, чтобы получить вклады, занимает большую часть полного запроса.Теперь мы можем углубиться в этот метод, чтобы попытаться изолировать наиболее трудоемкую часть.Следующий набор результатов показывает:

        timeToOpenUrl: 0.5734567642211914
timeToInstantiateSoup: 0.3690469264984131
      timeToFindRects: 0.0023255348205566406

Из этого видно, что большую часть времени тратится на фактическое открытие URL-адреса и получение HTML-кода (это означает, что задержка в сети, скорость интернет-соединения, время ответа сервера GitHubи т. д. являются вероятными подозреваемыми).Следующим самым тяжелым является время, которое фактически требуется для создания экземпляра анализатора BeautifulSoup.

Возьмите все эти конкретные числа с частичкой соли.Они на моем оборудовании (12-летний ПК) и моем локальном интернет-соединении.В вашей системе эти цифры, скорее всего, будут различаться и даже могут существенно отличаться.Дело в том, что лучший способ отследить медлительность состоит в том, чтобы выполнить некоторые основные шаги по устранению неполадок, чтобы определить, где происходит медлительность .После того как вы определили проблемные области, вы можете найти более конкретные ответы или задать более точные вопросы .

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