Производительность Django QuerySet

Я отлаживаю генерацию карты сайта и в итоге получил следующий фрагмент:

        items=Event.objects.all()
        for limit in (1000, 10000, 20000):
            events=items[:limit]
            print(f'{limit=}')
            start=time()
            for obj in events.values('id', 'slug', 'date_updated'):
                s='/events/{0[slug]}_{0[id]}_{0[date_updated]}/'.format(obj)
            print(f'  Time spent: {time()-start:.2f}')
            start=time()
            for obj in events.only('slug', 'date_updated'):
                s=f'/events/{obj.slug}_{obj.pk}_{obj.date_updated}/'
            print(f'  Time spent: {time()-start:.2f}')

И у меня есть следующий вывод:

limit=1000
  Time spent: 0.26
  Time spent: 9.80
limit=10000
  Time spent: 0.66
  Time spent: 85.09
limit=20000
  Time spent: 1.18
  Time spent: 177.20

Я вижу в документации, что QuerySet.values() рекомендуется использовать для небольшого количества полей и когда вам не нужно полное поведение модели, что действительно имеет место в данном случае. Но действительно ли накладные расходы на создание экземпляров Model (и всего остального, что находится под капотом) так велики?

Или это что-то с моей установкой и (неправильной) конфигурацией. Когда он выполняет модели, я вижу, что оба процесса - python и mysql - потребляют процессор. И это необъяснимо, потому что тот же запрос, когда я запускаю его в mysql-клиенте, занимает полсекунды.

Вернуться на верх