Как стать автором
Обновить

Комментарии 4

queryset.filter() — возвращает ленивый объект QuerySet, запрос к базе не выполняется, считать скорость выполнения бессмысленно.


Сравнивать различные запросы к бд и замерять курлом время получения ответа так же некорректно, т.к. гораздо больше времени будет затрачено на миддлвари/сериализацию данных.

Он не выполняется только если это было первое объявление queryset, у меня его специально нет. Да и время выполнения скрипта было бы меньше, чем в Postgres (при первой попытке у меня так и получилось, пока я не вчитался в документацию), если бы запрос не выполнялся. Но это не так.

Отсюда docs.djangoproject.com/en/3.0/ref/models/querysets:

A QuerySet is iterable, and it executes its database query the first time you iterate over it. For example, this will print the headline of all entries in the database:

for e in Entry.objects.all():
    print(e.headline)



Курл — только для проверки адекватности полученных данных и для понимания того времени, сколько ответ будет идти до клиента.

Я же это объясняю здесь:

Выбор метрик

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


Если у Вас есть предложение — каким образом можно это корректнее посчитать, то излагайте, я скорректирую.
Он не выполняется только если это было первое объявление queryset, у меня его специально нет. Да и время выполнения скрипта было бы меньше, чем в Postgres, если бы запрос не выполнялся. Но это не так.


Документация же говорит об обратном:
docs.djangoproject.com/en/3.0/topics/db/queries/#querysets-are-lazy
docs.djangoproject.com/en/3.0/ref/models/querysets/#when-querysets-are-evaluated

Вы можете сколько угодно раз создавать / фильтровать запросы, выполнены они будут только при реальном обращении к данным.

Для подсчета времени выполнения функции лучше использовать time.perf_counter или что-то из модуля timeit
Понял, поправил (начал выводить длину полученного объекта. Что это, если не обращение к данным?), перепроверил результаты и они не изменились.

Спасибо за модуль timeit, проверю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории