feat: Implement raw=True mode for high-performance figure construction#5515
feat: Implement raw=True mode for high-performance figure construction#5515AlonSpivack wants to merge 2 commits intoplotly:mainfrom
Conversation
Add _as_dict=True parameter to trace constructors and go.Figure for ~4-6x faster figure construction when validation is not needed. Fast paths added for: - BasePlotlyType.__new__ / BaseTraceType.__new__ - BaseFigure.__init__, .data, .layout, .add_traces, .update_layout - BaseFigure._add_annotation_like, ._process_multiple_axis_spanning_shapes
|
Implementation for #5514. |
efab3a2 to
0b37698
Compare
|
Update: Renamed PR title and description to finalize raw=True API (formerly _as_dict). |
- Implements in BaseFigure and trace constructors - Adds global config - Optimizes , , - Adds comprehensive tests in
cc3fd8b to
9edfae9
Compare
|
Hi @emilykl 👋 If there are any concerns about the API design (e.g. the Let me know if there's anything I can do to make the review easier! |
Description
This PR implements the
raw=Trueparameter forgo.Figure, trace constructors, and validation-heavy methods like add_traces, update_layout, and shape additions. It also introduces a global configuration flagplotly.config.rawto enable this mode by default.When
raw=Trueis active (either via parameter or global config):Usage
1. Global Configuration (Recommended)
Ideally suited for production environments where performance is critical:
2. Per-Object Configuration
You can also enable it for specific objects without changing global application state:
Benchmarks
Run the following script to reproduce:
Benchmark Script (bench_raw.py)
This enables extremely high-performance generation of Plotly figures for large datasets or high-throughput applications.
Limitations (Trade-offs for Performance)
In raw mode, the following features are unavailable because they rely on the validation engine:
xaxis_title="X"are not expanded to nested dicts. Use explicit nesting:xaxis={"title": {"text": "X"}}.xaxis="x2", yaxis="y2").layout.title = "X"works (JS support), but settinglayout.xaxis.title = "X"fails (JS expects object). Uselayout.xaxis.title = {"text": "X"}.Issues
Closes #5514