Понимание оптимизации запросов Polars: оптимизация оптимизацииPython

Программы на Python
Anonymous
Понимание оптимизации запросов Polars: оптимизация оптимизации

Сообщение Anonymous »

Я немного не понимаю, что именно происходит при оптимизации запросов Polars и можно ли (или как) лучше контролировать оптимизацию.
Я выполняю большой ленивый запрос (сотни выражений) на относительно небольшом количестве строк данных. Профилируя время выполнения запроса с помощью .profile(), я вижу, что около 2,2 секунды из 2,5 секунд общего времени выполнения приходится на начальный этап оптимизации. Мой код для профилирования выглядит примерно так:

Код: Выделить всё

some_lazy_query.profile()[1]
Поскольку я вижу очень мало возможностей для оптимизации в моем конкретном запросе, я попытался отключить все флаги оптимизации, чтобы посмотреть, как это повлияет на оптимизацию и общее время выполнения, используя следующее:

Код: Выделить всё

_opts = pl.QueryOptFlags(
predicate_pushdown = False,
projection_pushdown = False,
simplify_expression = False,
slice_pushdown = False,
comm_subplan_elim = False,
comm_subexpr_elim = False,
cluster_with_columns = False,
check_order_observe = False,
fast_projection = False,
sort_collapse = False
)

some_lazy_query.profile(optimizations=_opts)[1]
Время оптимизации теперь сократилось с 2,2 до 2,13 секунды, общее время выполнения практически не изменилось и составляет 2,5 секунды. Я знаю, что некоторые оптимизации Polars нельзя отключить, но все равно очень удивлен, увидев, что отключение всех доступных флагов почти не влияет на время оптимизации.
Поэтому у меня такие вопросы:
  • Правильно ли я это делаю? Есть ли какие-либо другие способы сократить время оптимизации, которые я до сих пор не заметил?
  • Из любопытства, что продолжает делать шаг оптимизации после отключения всех флагов?
  • Есть ли у вас какие-либо другие идеи о том, как ускорить запросы, в которых накладные расходы на оптимизацию огромны по сравнению с фактическим выполнением запроса (из-за большого количества столбцов, но всего лишь нескольких строк данных)?
Я использую последнюю версию поляров (1.40.0), результаты аналогичны немного более ранним версиям (например, 1.38.1).
Я знаю, что запрос функции № 25246 в конечном итоге решит проблему для моего приложения, поскольку это позволит предварительно запустить оптимизацию, но, похоже, прогресс в этом вопросе пока незначителен, и реализация этой функции может занять месяцы или годы.

Вернуться в «Python»