Reflex เปิดตัว XY ไลบรารี Python ความเร็วสูง รองรับแผนภูมิระดับ 100 ล้านจุดด้วย Rust

Reflex AI ได้เปิดตัว XY ไลบรารีการสร้างแผนภูมิ Python โอเพนซอร์สภายใต้สัญญาอนุญาต Apache-2.0 สำหรับการสร้างภาพข้อมูล 2 มิติแบบโต้ตอบ (Interactive 2D Visualization) โดยมุ่งแก้ปัญหาข้อจำกัดของไลบรารีส่วนใหญ่ที่มักสร้างออบเจ็กต์แยกตามแถวข้อมูล ซึ่งทำให้ประสิทธิภาพลดลงเมื่อข้อมูลเกินสองสามแสนจุด
XY แก้ปัญหานี้ด้วยการย้ายงานเรนเดอร์ไปยัง native Rust core และส่งข้อมูลไปยังเบราว์เซอร์ผ่าน typed binary buffers แทนการใช้ JSON พร้อมวาดภาพด้วย WebGL2 ส่งผลให้มีประสิทธิภาพสูงมาก จากผลการทดสอบพบว่า XY ใช้เวลาเพียง 0.071 วินาทีที่ 10,000 จุด และคงความเร็วที่ 0.081 วินาทีแม้ข้อมูลจะสูงถึง 100 ล้านจุด
Is it deployable
ปัจจุบัน XY ยังอยู่ในช่วง early alpha เวอร์ชัน 0.0.1 โดยรองรับ Python 3.11 ขึ้นไป แม้จะยังไม่แนะนำให้ใช้กับระบบวิกฤตที่ต้องเผชิญกับลูกค้าโดยตรงในตอนนี้ แต่สตาร์ทอัพและทีมข้อมูลสามารถเริ่มใช้งานในการวิเคราะห์ภายในองค์กร การใช้บน notebooks หรือการแชร์ผลลัพธ์ข้อมูลขนาดใหญ่ได้ทันที
ไลบรารีนี้เหมาะอย่างยิ่งสำหรับงานที่จำนวนข้อมูลเป็นคอขวด เช่น การเงินเชิงปริมาณ (Tick data), จีโนมิกส์และชีวสารสนเทศศาสตร์, การสังเกตการณ์และเทเลเมทรี (Observability), ดาราศาสตร์ และ การวิเคราะห์ข้อมูลเชิงพื้นที่ โดยสามารถติดตั้งได้ง่ายๆ เพียงใช้คำสั่ง:
pip install xyExplainer
How the representation ladder works
XY จัดเก็บข้อมูลในคอลัมน์ f64 ผ่าน ColumnStore ใน Python โดยมีการเลือกรูปแบบการเรนเดอร์ตามความเหมาะสม เช่น ใช้ M4 decimation เมื่อเกิน 10,000 แถว สำหรับข้อมูลเส้น และใช้ automatic scatter density เมื่อเกิน 200,000 จุด โดยใช้ตารางความหนาแน่นเริ่มต้นที่ 512×384 เซลล์
จุดเด่นสำคัญคือความแม่นยำของข้อมูลยังคงถูกรักษาไว้ใน Python ทำให้การทำ hover, selection และ pick() สามารถดึงค่าจากแถวข้อมูลต้นฉบับออกมาได้จริง เมื่อมีการซูมหรือเลื่อนดูพื้นที่ใกล้เคียง ระบบจะเรนเดอร์จากหน้าต่างที่แคชไว้โดยไม่ต้องส่งคำขอใหม่ ซึ่งการแบ่งช่วงความหนาแน่น (Binning) และการเรนเดอร์จะใช้พลังจาก GPU ทั้งหมด
Performance
จากการทดสอบ benchmark บน Apple M5 Pro โดยวัดผลจนกว่าการแสดงผลบนเบราว์เซอร์จะนิ่งสนิท พบผลลัพธ์ที่น่าทึ่งดังนี้:
| Points | 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 | ✕ | ✕ |
ข้อมูลนี้แสดงให้เห็นว่า XY เร็วกว่าเดิมถึง 34 เท่าที่ 10 ล้านจุด และเร็วขึ้น 177 เท่าที่ 50 ล้านจุด อีกทั้งยังประหยัดหน่วยความจำอย่างมาก โดยที่ 10 ล้านจุด XY ใช้แรมเพียง 0.32 GiB เทียบกับ Plotly ที่ใช้สูงถึง 1.86 GiB และที่น่าประทับใจคือการส่งออก scatter plot ขนาด 10 ล้านจุด มีขนาดไฟล์เพียง 258 KiB เทียบกับ 259 MiB ของ Plotly
API surface and integration
XY รองรับการสร้างแผนภูมิกว่า 14 ประเภท เช่น scatter, line, histogram, heatmap และอื่นๆ โดยกำหนดสไตล์ผ่าน CSS และ Tailwind ได้ สำหรับผู้ที่ต้องการย้ายระบบ สามารถใช้ import xy.pyplot as plt เพื่อรันโค้ด Matplotlib ทั่วไปได้ทันที (ตามข้อจำกัดใน compatibility guide) นอกจากนี้ยังมี reflex-xy สำหรับเชื่อมต่อกับเฟรมเวิร์ก Reflex โดยไม่ต้องเขียน JavaScript
Key Takeaways
- XY รักษาความเร็วในการเรนเดอร์ที่ 0.08 วินาที ตั้งแต่หมื่นจุดจนถึงร้อยล้านจุด ด้วยเทคนิคจำกัดการวาดตามขอบเขตหน้าจอ
- การใช้ Rust core และการส่งข้อมูลแบบไบนารี ช่วยลดขนาดไฟล์ส่งออกลงมหาศาลจาก 259 MiB เหลือเพียง 258 KiB สำหรับข้อมูล 10 ล้านจุด
- ข้อมูล f64 ยังคงความแม่นยำสูง รองรับการทำ hover และซูมลึกถึงระดับแถวต้นฉบับได้
- เหมาะสำหรับงานสายวิจัยและวิเคราะห์ข้อมูลที่ต้องการเลิกใช้วิธีสุ่มตัวอย่าง (Sampling) และต้องการเห็นภาพข้อมูลจริงทั้งหมดในคราวเดียว
ผู้ที่สนใจสามารถเข้าไปดูรายละเอียดเพิ่มเติมได้ที่ GitHub Repo
นอกจากนี้ อย่าลืมติดตามเราที่
ความคิดเห็น (0)
เข้าสู่ระบบเพื่อร่วมแสดงความเห็น
สมัครสมาชิกมาเป็นคนแรกที่แสดงความเห็นกันเลยโบร
