Что может вызывать значительное замедление работы программы?

Здравствуйте! У меня есть код для парсинга, представленный в файле <b>scrapper.py</b>. Вот его структура: 

<pre><code class="python">...

main_data = {
    'organization_name': [],
    'organization_voen': [],
    'organization_address': [],
    'event_name': [],
    'event_number': [],
    'classification_code': [],
    'suggested_price': [],
    'event_start_date': [],
    'submission_deadline': [],
    'envelope_opening_date': [],

    'participation_fee': [],
    'participation_description': [],

    'usage_fee': [],
    'usage_description': [],

    'full_name': [],
    'contact': [],
    'position': [],
    'phone_number': []
}

nested_data = {
    'heading': [],
    'disclosure': [],
    'quantity': [],
    'measure_unit': [],
    'code': []
}

def get_total_items_from_link(api_link='https://etender.gov.az/api/events?EventType=2&amp;PageSize=1&amp;PageNumber=1&amp;EventStatus=1&amp;Keyword=&amp;buyerOrganizationName=&amp;PrivateRfxId=&amp;publishDateFrom=&amp;publishDateTo=&amp;AwardedparticipantName=&amp;AwardedparticipantVoen=&amp;DocumentViewType='):
    try:
        response = requests.get(api_link, timeout=20)
        if response.status_code == 200:
            data = response.json()
            return data['totalItems']
    except requests.Timeout:
        return -1
    return -1

def get_total_items_from_id(id):
    ...

def get_all_events_ids(page_size):
    template = f'https://etender.gov.az/api/events?EventType=2&amp;PageSize={page_size}&amp;PageNumber=1&amp;EventStatus=1&amp;Keyword=&amp;buyerOrganizationName=&amp;PrivateRfxId=&amp;publishDateFrom=&amp;publishDateTo=&amp;AwardedparticipantName=&amp;AwardedparticipantVoen=&amp;DocumentViewType='
    try:
        response = requests.get
</pre>

Как правильно использовать этот код для извлечения данных?
  • 6 октября 2024 г. 15:24
Ответы на вопрос 1
Здесь несколько причин, которые могут вызывать значительное замедление работы вашего парсера, а также рекомендации по его оптимизации:

1. **Частые HTTP-запросы**: Если код вызывает много HTTP-запросов к API, это может значительно замедлить выполнение программы. Каждый запрос требует времени на установление соединения и получение ответа. Чтобы минимизировать время ожидания, вы можете:
   - Уменьшить количество запросов, если это возможно. Например, запрашивайте данные страницами и обрабатывайте их сразу.
   - Использовать асинхронные запросы, что позволит отправлять несколько запросов одновременно.

2. **Увеличенное время ожидания (timeout)**: В вашем коде используется таймаут 20 секунд для запросов. Если сервер долго отвечает, это может замедлить выполнение. Попробуйте уменьшить время ожидания, но в то же время не слишком сильно, чтобы не потерять возможность получить ответ.

3. **Обработка данных**: Логика обработки данных после загрузки каждого ответа также может быть медленной. Убедитесь, что вы делаете это эффективно. Например, попробуйте минимизировать количество операций, выполняемых с данными в цикле.

4. **Лимиты API**: Если API накладывает ограничения на количество запросов в секунду, вы можете столкнуться с задержками из-за ограничения скорости. Лучше добавлять задержку между запросами, если это необходимо.

5. **Отсутствие кэширования**: Кэширование запросов, если это возможно, может существенно улучшить производительность. Например, если вы собираете данные, которые редко меняются, можно кэшировать ответы и использовать их повторно.

6. **Использование цикла в `get_all_events_ids`**: Если функция `get_all_events_ids` выполняет итерации по страницам с данными с помощью однопоточных запросов, это может также замедлять выполнение. Применение многопоточности или асинхронного программирования может помочь.

### Пример использования вашего кода

Вот пример того, как вы можете использовать ваш код для извлечения данных:

```python
# Пример использования get_total_items_from_link
total_items = get_total_items_from_link()
if total_items != -1:
    print(f"Total items found: {total_items}")

    # Предположим, что мы хотим получить все ID событий
    page_size = 100  # Количество событий на странице
    for page_number in range(1, (total_items // page_size) + 2):
        all_events_ids = get_all_events_ids(page_size)
        # Обработайте ID событий здесь
```

Приведенный выше код демонстрирует, как можно вызывать функции для извлечения общего количества событий и последующего их получения. Не забудьте доработать функции, такие как `get_all_events_ids`, чтобы они помимо получения события возвращали необходимые данные.

### Оптимизация с использованием асинхронного программирования

Если вы хотите повысить производительность, рассмотрите возможность применения библиотеки `asyncio` с `aiohttp` для асинхронных запросов. Пример можно улучшить следующим образом:

```python
import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.json()

async def main():
    api_link = 'https://etender.gov.az/api/events?EventType=2&PageSize=1&PageNumber=1&EventStatus=1&Keyword=&buyerOrganizationName=&PrivateRfxId=&publishDateFrom=&publishDateTo=&AwardedparticipantName=&AwardedparticipantVoen=&DocumentViewType='
    async with aiohttp.ClientSession() as session:
        data = await fetch(session, api_link)
        print(data)

# Запускаем основной цикл
asyncio.run(main())
```

Это более эффективный способ работы с API и может значительно ускорить ваш код.
Похожие вопросы