
Разработчики фреймворка Reflex открыли исходный код XY — библиотеки интерактивной 2D-визуализации данных для Python, которая выносит рендеринг в нативный Rust-модуль и отрисовывает изображение через WebGL2. По заявлению команды, XY сохраняет отзывчивость графиков и на 100 млн точек, тогда как классические Python-стеки заметно деградируют уже после нескольких сотен тысяч строк. Проект опубликован под лицензией Apache-2.0, ставится через pip install xy и требует Python 3.11 или новее. Текущая версия — ранняя альфа 0.0.1.
Что именно выпустила Reflex
В отличие от большинства Python-библиотек, которые создают по одному объекту отрисовки на строку данных, XY разделяет хранение и рендеринг. Точные значения колонок (f64) остаются в ColumnStore на стороне Python, а в браузер уходят типизированные бинарные буферы вместо JSON. Благодаря этому наведение, выделение и pick() возвращают исходные строки, а при зуме в узкое окно выдаются точные видимые точки из закешированного окна — соседние панорамы рендерятся без нового запроса. Графики собираются декларативно из marks, осей, легенд, тултипов и аннотаций; сейчас доступно 14 семейств диаграмм, включая scatter, line, area, histogram, box, violin, ECDF, heatmap, hexbin и contour.
Как достигается скорость
Внутри XY применяются несколько политик прореживания: M4-децимация для длинных упорядоченных линий включается по умолчанию выше 10 тыс. строк, автоматическое уплотнение scatter — выше 200 тыс. точек, с сеткой плотности 512×384 ячейки по умолчанию. Авторы прямо предупреждают, что это политики до версии 1.0, а не гарантии API. Отдельно подчёркнуто, что рендеринг — это нативная бининг-сетка с GPU-отрисовкой, а не полностью GPU-конвейер приёма данных: ингест, бининг и децимация по-прежнему масштабируются от числа исходных строк.
Что показывают бенчмарки
Reflex приводит замеры, выполненные в реальном браузере: таймер останавливается только после проверки корректности и стабильности канваса по десяти байт-идентичным кадрам. Измерения сделаны на одном Apple M5 Pro с одним прогоном на ячейку. Заявлено время рендера 0.071 с на 10 тыс. точек и 0.081 с на 100 млн точек, ускорение 34× на 10 млн и 177× на 50 млн точек. Пиковое потребление памяти на стороне Python на 10 млн точек составило 0.32 GiB у XY против 0.84 GiB у Matplotlib и 1.86 GiB у Plotly. При density=False XY отрисовывает 100 млн точных маркеров за 1.343 с на 5.26 GiB, а интерактивный scatter на 10 млн точек экспортируется в HTML размером 258 KiB против заявленных ~259 MiB у аналога на Plotly — размер payload остаётся около 258 KiB от 1 млн до 100 млн строк. Также команда сообщила о рендеринге полного набора данных OpenStreetMap — 10 млрд точек.
Ключевые факты
| Параметр | Значение |
|---|---|
| Лицензия и версия | Apache-2.0, v0.0.1 (альфа), Python 3.11+, pip install xy |
| Время рендера | 071 с на 10 тыс. точек, 0.081 с на 100 млн (замеры Reflex, Apple M5 Pro) |
| Память на 10 млн точек | 32 GiB (XY) против 0.84 GiB (Matplotlib) и 1.86 GiB (Plotly) |
| HTML-экспорт на 10 млн точек | 258 KiB против ~259 MiB у Plotly |
Где это пригодится
Главный сценарий — задачи, где узким местом становится именно число строк: тиковые данные в количественных финансах, манхэттен-плоты и сканы частот аллелей в геномике и биоинформатике, обсервабельность и телеметрия, астрономия и геопространственная аналитика. Стартапы и средние дата-команды могут пробовать XY уже сейчас во внутренней аналитике, ноутбуках и публикуемых артефактах; регулируемым предприятиям разумнее ограничиться пилотом, а не ставить альфу на критический пользовательский путь.
Миграция и экосистема
Для перехода предусмотрен совместимый импорт import xy.pyplot as plt, который выполняет часть стандартного кода Matplotlib pyplot, хотя в гайде по совместимости прямо указано, что поддерживается не