Производительность 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-клиенте, занимает полсекунды.