Вызов функции Python против запроса к базе данных (django ORM) накладные расходы

#python #django #postgresql #django-orm #overhead

#python #django #postgresql #django-orm #накладные расходы

Вопрос:

Во время работы в проекте Django, когда я вижу, что могу уменьшить запрос к базе данных для некоторых случаев, если я использую вызов функции (например) datetime.today() Я выбираю это для повышения эффективности, поскольку, насколько я знаю, запрос к базе данных является самой дорогостоящей операцией в производственной среде.

Я прав в этом? Подумайте о базе данных postgres с сотнями тысяч записей, я использую datetime.today() функцию и проверяю, есть ли она сегодня, если нет, то не запускайте запрос к базе данных (запрос filter exists()).). Постоянное выполнение запроса к базе данных также служит моей логической цели, но я добавляю вызов функции datetime только для повышения эффективности, поскольку для этого случая достаточно выполнения запроса только на сегодня. Этот фрагмент кода находится внутри цикла.

Будет ли этот подход более эффективным, чем просто постоянное выполнение запроса к базе данных?

Ответ №1:

Вообще говоря, запрос к базе данных будет быстрее, чем функция python или django, поскольку базы данных имеют очень низкий уровень по сравнению с python.

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

кроме того, python не компилируется, а интерпретируется, что означает, что он никогда не преобразуется в более быстрый ассемблерный код, а байт-код, который интерпретируется виртуальной машиной, тогда как базы данных создаются на c, который компилируется в сборку, которая выполняется непосредственно на процессоре

Если вы хотите сэкономить время и оптимизировать, я бы посоветовал взглянуть на структуру кэширования, как если бы вы выполняли этот запрос один раз в день, вы могли бы добавить его в кеш с истечением одного дня и просто проверить его

Редактировать:

проверка эталонного теста django ORM может обрабатывать около 2073,64 транзакций Get в минуту примерно 1 раз в 30 миллисекунд, тогда как тесты datetime показывают, что он может анализировать за 0,01 мс, поэтому в этом случае, вероятно, datetime.today

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

1. Но запрос к базе данных будет выполняться через django-orm, что, я думаю, является своего рода вызовом функции, но я не совсем уверен. Мы также должны учитывать накладные расходы django-orm, а не только накладные расходы postgres. Будет ли запрос orm по-прежнему быстрее, чем вызов функции после всего этого?

2. я обновил ответ, с помощью тестов кажется, что datetime, вероятно, лучший способ, если вы не хотите использовать кэширование