Проблема масштабирования в Python-графике
Большинство популярных библиотек визуализации в Python (Matplotlib, Plotly) создают отдельный объект отрисовки для каждой строки данных. Это приводит к критическому падению производительности при работе с наборами данных свыше нескольких сотен тысяч точек: замедляется рендеринг, интерактивные элементы (зум, наведение курсора) становятся неюзабельными. Reflex решила эту проблему, перенеся вычислительное ядро на Rust и изменив способ передачи данных в браузер.
Техническая архитектура XY
Библиотека XY (версия 0.0.1, лицензия Apache-2.0) использует следующие ключевые оптимизации:
- Rust Core: Вычисления и подготовка данных происходят в нативном коде Rust, что исключает узкие места GIL (Global Interpreter Lock) Python.
- Binary Transport: Вместо передачи тяжелых JSON-структур, в браузер отправляются типизированные бинарные буферы.
- WebGL2 Rendering: Отрисовка происходит через GPU, что позволяет обрабатывать миллионы маркеров без перегрузки CPU.
- ColumnStore: Канонические данные хранятся в виде столбцов f64 в Python, сохраняя точность для операций hover и selection, даже если визуализация использует децимацию.
Результаты бенчмарков
Тестирование проводилось на Apple M5 Pro. Измерялось время до момента, когда холст становился стабильным и идентичным в 10 последовательных кадрах. XY демонстрирует практически постоянное время рендеринга независимо от количества точек (от 10 000 до 100 млн), так как отрисовываются только видимые на экране пиксели, а не отдельные маркеры.
| Количество точек | Reflex XY | Matplotlib (WebAgg) | Plotly (scattergl) |
|---|---|---|---|
| 1M | 0.084 s | 0.357 s | 0.614 s |
| 10M | 0.083 s | 2.804 s | 3.367 s |
| 50M | 0.076 s | 13.385 s | — |
| 100M | 0.081 s | — | — |
При этом пиковое потребление памяти Python-процессом для 10 млн точек составляет всего 0.32 GiB у XY, против 0.84 GiB у Matplotlib и 1.86 GiB у Plotly.
Практическое применение и ограничения
XY особенно полезна в областях, где объем данных является главным ограничителем: количественные финансы (тик-данные), геномика (Манхэттенские графики), телеметрия и астрономия. Библиотека поддерживает 14 семейств графиков (scatter, line, histogram, heatmap и др.) и предлагает совместимость с Matplotlib через import xy.pyplot as plt.
Важное замечание: XY находится в стадии early alpha (v0.0.1). Рекомендуется использовать её для внутренних аналитических дашбордов, Jupyter-ноутбуков и исследовательских задач. Для критически важных пользовательских интерфейсов (customer-facing) требуется дополнительное тестирование. Размер экспорта HTML-файла с 10 млн точек составляет всего 258 KiB (против 259 MiB у аналогов).
Как установить
Требования: Python 3.11+. Установка стандартная через pip:
pip install xy
Источник: MarkTechPost ↗
