تصور کنید میخواهید ۱۰۰ میلیون نقطه داده را روی یک نمودار رسم کنید و با یک کلیک، بدون هیچ تأخیری روی آنها زوم کنید. این رویایی که تا پیش از این در پایتون به دلیل محدودیتهای حافظه غیرممکن بود، اکنون با زمان خیرهکننده ۰.۰۸۱ ثانیه به واقعیت تبدیل شده است.
Reflex AI کتابخانه XY را تحت لایسنس Apache-2.0 منتشر کرد تا مشکل قدیمی پایتون در رسم نمودارها را حل کند؛ مشکلی که در آن سرعت رندرینگ پس از عبور از چند صد هزار نقطه بهسریع سقوط میکند. در اکثر ابزارهای بصریسازی پایتون، برای هر ردیف داده یک شیء گرافیکی مجزا ساخته میشود. این رویکرد باعث میشود زوم کردن یا نمایش جزئیات (Hover) در مقیاس بزرگ تقریباً غیرممکن شود. XY این رویکرد را با یک هسته Rust — که زبانی فوقسریع و ایمن برای مدیریت حافظه است — جایگزین کرده است. این هسته بهجای ارسال فایلهای سنگین JSON، بافرهای باینری تایپشده را مستقیماً به مرورگر میفرستد و از WebGL2 برای رسم شتابیافته توسط سختافزار استفاده میکند.
بنچمارکهای عملکرد
به نقل از گزارش Marktechpost، تفاوت عملکرد XY در مقایسه با استانداردهای فعلی روی سختافزار Apple M5 Pro تکاندهنده است. در این آزمایشها، ساعت زمان تنها زمانی متوقف شده که بوم رسم در ۱۰ فریم متوالی (که از نظر بایتی کاملاً یکسان هستند) پایدار شده باشد:
- در ۱۰ میلیون نقطه: XY در ۰.۰۸۳ ثانیه رندر میکند، در حالی که Matplotlib (نسخه WebAgg) حدود ۲.۸۰۴ ثانیه و Plotly (نسخه scattergl) حدود ۳.۳۶۷ ثانیه زمان میبرند. این یعنی افزایش سرعت ۳۴ برابری.
- در ۵۰ میلیون نقطه: سرعت XY در ۰.۰۷۶ ثانیه باقی میماند، اما Matplotlib به ۱۳.۳۸۵ ثانیه کند میشود و Plotly بهطور کلی در رندرینگ شکست میخورد. این یک جهش ۱۷۷ برابری در سرعت است.
- در ۱۰۰ میلیون نقطه: XY همچنان در ۰.۰۸۱ ثانیه پایدار است، در حالی که رقبای سنتی از پس این حجم برنمیآیند و قادر به نمایش نیستند.
- بهرهوری حافظه: برای ۱۰ میلیون نقطه، XY تنها ۰.۳۲ گیگابایت حافظه پیک (Peak) در سمت پایتون اشغال میکند، در حالی که این عدد برای Matplotlib برابر ۰.۸۴ و برای Plotly حدود ۱.۸۶ گیگابایت است.

سلسلهمراتب نمایش دادهها
از نظر فنی، XY برای حفظ سرعت از مکانیزمی به نام «سلسلهمراتب نمایش» (Representation Ladder) استفاده میکند. دادهها در قالب ستونهای f64 در یک ColumnStore پایتونی ذخیره میشوند و مدل رندرینگ بر اساس اندازه تریک (Trace Size) انتخاب میشود:
- Decimation: برای خطوط مرتب طولانی، اگر تعداد ردیفها از ۱۰,۰۰۰ مورد بیشتر شود، فرآیند M4 Decimation فعال میشود تا تعداد نقاط کاهش یابد اما شکل کلی حفظ شود.
- Density: برای دادههای پراکنده (Scatter)، اگر تعداد نقاط از ۲۰۰,۰۰۰ مورد فراتر رود، حالت تراکم خودکار فعال میشود.
- Grids: شبکههای تراکم بهطور پیشفرض روی ۵۱۲ در ۳۸۴ سلول تنظیم شدهاند.
همانطور که در تحلیلهای قبلی ما درباره بهینهسازیهای سطح پایین در زبانهای برنامهنویسی اشاره کردیم، جابجایی پردازش از لایه تفسیرشده (Interpreted) به لایه کامپایلشده (Compiled) تنها راه عبور از سد حافظه است. طبق اعلام Reflex، این آستانهها فعلاً مربوط به سیاستهای نسخههای پیشاز-۱.۰ هستند و تضمین قطعی API محسوب نمیشوند. با این حال، باید توجه داشت که اگرچه تراکم بهصورت بومی دستهبندی (Binning) و توسط GPU رندر میشود، اما فرآیندهای دریافت، دستهبندی و کاهش نقاط همچنان با تعداد ردیفهای منبع مقیاسپذیر هستند.
با وجود این بهینهسازیها، یکپارچگی دادهها کاملاً حفظ شده است. چون مقادیر دقیق همچنان در پایتون باقی میمانند، تابع pick() و ابزارهای Hover همچنان میتوانند ردیفهای اصلی را بازیابی کنند. وقتی روی یک پنجره کوچک زوم میکنید، یک درخواست برای نقاط دقیق قابل مشاهده در یک پنجره تراز شده (Aligned Window) ارسال میشود. جابجاییهای (Pan) نزدیک به آن ناحیه، از همان پنجره کششده رندر میشوند بدون اینکه درخواست جدیدی ارسال شود.
رابط برنامهنویسی و یکپارچهسازی
برای توسعهدهندگان، رابط برنامهنویسی (API) این کتابخانه بهصورت Declarative است و از اجزای Markها، محورها، راهنمای نمودار (Legends)، Tooltipها و یادداشتها تشکیل شده است. این ابزار از ۱۴ خانواده نمودار پشتیبانی میکند، از جمله:
- Scatter و Line
- Area و Histogram
- Box و Violin
- ECDF، Heatmap، Hexbin و Contour
استایلدهی در این کتابخانه از طریق اسلاتهای پایدار DOM، کلاسهای CSS و Tailwind را میپذیرد. برای تسهیل مهاجرت، XY قابلیت import xy.pyplot as plt را ارائه داده تا کاربران بتوانند کدهای رایج Matplotlib را اجرا کنند، هرچند راهنمای سازگاری اشاره میکند که همه قابلیتها پشتیبانی نمیشوند. همچنین یک آداپتور به نام reflex-xy وجود دارد که هر نمودار را بدون نیاز به جاوااسکریپت یا iframe به یک کامپوننت Reflex تبدیل میکند.
کاربردهای عملی و استقرار
این تغییر، پیشفرضهای تحلیل داده در حوزههایی مثل مالی کمی (دادههای Tick)، ژنومیک و بیوانفورماتیک (نمودارهای Manhattan و اسکنهای فرکانس آلل)، نظارت سیستمها (Observability)، تلهمتری، نجوم و تحلیلهای زمینفضایی را تغییر میدهد. تا پیش از این، استاندارد این بود که دادهها پیش از رسم، نمونهبرداری (Downsampling) شوند تا مرورگر کرش نکند. Reflex حتی رندر کامل مجموعهداده OpenStreetMap با ۱۰ میلیارد نقطه را گزارش کرده است.
با این حال، باید توجه داشت که XY در حال حاضر در نسخه ۰.۰.۱ و در مرحله Alpha است. این ابزار برای نوتبوکهای داخلی و خروجیهای HTML قابل اشتراک عالی است، اما هنوز برای مسیرهای حساس تجاری و مشتری-محور در محیطهای سازمانی تحت نظارت توصیه نمیشود. تیمهای داده میتوانند با دستور pip install xy (در پایتون ۳.۱۱ یا جدیدتر) آن را نصب کنند.
چه در حال رصد دادههای Tick باشید و چه اسکنهای فرکانس آلل، این بهرهوری خیرهکننده است. در حالت density=False (غیرفعالسازی تراکم)، XY همچنان میتواند ۱۰۰ میلیون مارکر دقیق را در ۱.۳۴۳ ثانیه روی ۵.۲۶ گیگابایت حافظه رسم کند. جالبترین نکته در حجم خروجی است: یک نمودار تعاملی ۱۰ میلیون نقطهای در XY تنها ۲۵۸ کیلوبایت حجم HTML دارد، در حالی که معادل آن در Plotly به ۲۵۹ مگابایت میرسد. این حجم Payload برای دادههایی از ۱ میلیون تا ۱۰۰ میلیون ردیف، تقریباً در همان سطح ۲۵۸ کیلوبایت باقی میماند.
گام بعدی شما
- اگر با دادههای حجیم در Pandas سروکله میزنید، کتابخانه XY را جایگزین Plotly کنید تا سرعت لود داشبوردها را بررسی کنید.
- برای کاهش حجم فایلهای HTML ارسالی به مشتری، از قابلیت فشردهسازی باینری این ابزار استفاده کنید.
- مستندات سازگاری با Matplotlib را مطالعه کنید تا متوجه شوید کدام بخش از کدهای قدیمی شما بدون تغییر اجرا میشوند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است؛ برای درک اینکه چگونه GPUها این حجم از داده را مدیریت میکنند، به تحلیل ما درباره معماریهای جدید شتابدهنده مراجعه کنید.




گفتگو