← На главную

Python-библиотека XY с Rust-ядром рендерит 100M точек за 0,081 с

28.07.2026 15:54 · hackernews

Вышла XY — сверхбыстрая библиотека графиков для Python, которая одинаково хорошо работает в ноутбуках, браузерах и при статическом экспорте в HTML, PNG, SVG или PDF. Под капотом у неё Rust-ядро, которое для больших наборов данных вычисляет только видимые на экране точки с учётом разрешения. Разработчики утверждают, что с XY они отрисовали весь OpenStreetMap — 10 000 000 000 точек. Библиотека пока в альфе и получает частые обновления.

Графики можно описывать декларативно или через привычный pyplot-интерфейс (импорт xy.pyplot), а кастомизировать — с помощью Python, CSS или Tailwind. Один и тот же чарт без изменений крутится в Jupyter, веб-приложении или сохраняется как статичный файл. Устанавливается через pip install xy или uv add xy.

Главная фишка — производительность. В тестах на Apple M5 Pro XY показывает почти плоское время рендеринга при переходе от 10 тысяч до 100 миллионов точек: 0,071 с на 10k и 0,081 с на 100M. Такой эффект достигается за счёт того, что при более чем 200 тысячах строк движок автоматически рисует ограниченную экраном поверхность плотности, а не отдельный маркер на каждую точку. При зуме он возвращает точные исходные строки. Если принудительно включить отрисовку каждого маркера (флаг density=False), 100 миллионов маркеров рендерятся за 1,34 секунды и потребляют 5,26 GiB RAM. Для сравнения: Matplotlib (WebAgg) уходит за секунду на 3 миллионах точек и дорастает до 13,4 с на 50M, а 100M не вытягивает вовсе. Plotly (scattergl) перестаёт строить фигуру после 50M.

Для интерактивных дашбордов есть адаптер reflex-xy. Он превращает любой чарт XY в компонент Reflex без JavaScript-прослоек, iframe или отдельного сервиса. Достаточно установить пакет через pip install reflex-xy, зарегистрировать плагин в rxconfig.py и вставлять графики в дерево компонентов — зум, панорамирование и ховеры сохраняются.

Архитектурно всё устроено так: канонические данные в ColumnStore хранятся как f64-столбцы прямо в Python, Rust-ядро вычисляет нужный уровень детализации, в браузер уходит лёгкий JSON-спецификация плюс типизированные бинарные буферы, а финальный рендеринг идёт на WebGL2 и Canvas. Благодаря этому при панорамировании и зуме на живой машине запрашивается уточнённый payload, а оригинальные строки остаются доступны для выделения и всплывающих подсказок.

В ближайших планах разработки — категориальные распределения (strip, swarm, boxen), регрессионная диагностика, финансовые свечи с оверлеями вроде SMA, Bollinger, RSI, а также трёхмерные и объёмные визуализации (scatter, surfaces, isosurfaces). Полный бэклог выложен в открытом доступе, можно голосовать за фичи через GitHub Issues.

Читать оригинал →