Python скрипт замедляется со временем - PullRequest
0 голосов
/ 20 мая 2019

У меня есть сценарий Python 3, который в основном скребок данных из API.

Сам код работает нормально и скорость впечатляет, но со временем он замедляется.

Я понятия не имею, как найти причину, по которой это происходит медленнее.

Вот простой пример того, как это работает:

  1. Скрипт вызывает набор данных API, который возвращается как JSON и преобразуется в список, полный словарей.
  2. Список словарей зацикливается и проверяется по нескольким критериям.
  3. Если совпадение найдено, файл CSV открывается и результат записывается туда.
  4. После того, как все данные были проверены по определенным категориям (с простыми операторами If), все данные записываются в файл CSV.

  5. После того, как CSV-файл содержит более 100 точек данных, каждый раз, когда появляется новый, в последнем выводится новый.

  6. Повтор.

Теперь все в порядке, пока скрипт не запустится около 24 часов. Тогда скорость цикла будет около 32 секунд на цикл, и постепенно она будет увеличиваться со временем.

Мой вопрос - что может быть причиной этого? и где я могу посмотреть, что может вызвать это.

Пожалуйста, дайте мне знать, какую дополнительную информацию мне нужно предоставить, если я упустил какой-то первостепенный мир информации.

1 Ответ

0 голосов
/ 20 мая 2019

Обычно, если что-то замедляется со временем, по умолчанию я проверяю как минимум два элемента.

  1. Проверьте, поможет ли сборка мусора. Если объекты постоянно сохраняются, например, same_name = new_object, память оригинала same_name не освобождается. Это может привести к снижению производительности в дополнение к сокращению доступной памяти. Простой import gc, а затем время от времени запускается gc.collect(), может помочь.

  2. Объект продолжает расти в размерах. Если это так, и я не знаю, так ли это, потому что я не видел ваш код, тогда это может помочь сохранить куски объекта с помощью pickle. После достижения указанного размера сохраните объект и начните сначала.

Чтобы продолжить сужать его, возможно, вы могли бы добавить таймеры во всем вашем коде (особенно в тех местах, которые вы меньше всего ожидаете вызвать), и либо распечатать, либо записать данные синхронизации в файл журнала. Я просто использую from time import time, а затем start_time = time(), а затем end_time = time(), чтобы получить общее количество секунд, которое операция прошла через end_time - start_time. Эта информация может помочь вам увидеть, где код начинает занимать больше времени. Хранение этих данных в таблице поможет упростить использование, анализ и маркировку временных данных каким-либо именем, которое поможет вам точно знать, где информация была собрана в вашем коде.

Если вам случится сделать этот шаг, добавьте новую информацию в свой вопрос, чтобы помочь нам лучше помочь вам.

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