Performance: pcolormesh PNG export misses the 10× Matplotlib target (5.54× in release audit)

Aperta
#551 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
30/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
matplotlib, numpy, python, rust

Direzione di ricerca

Start with benchmarks/bench_pyplot_vs_matplotlib.py and spec/benchmarks/methodology.md; first apply the described DPI correction to the XY save call, then reproduce the pcolormesh row on a controlled runner and capture dimensions and raw samples. Profile build, rasterization, and PNG encoding to identify the measured bottleneck. Done means meeting the 10× standard target with image correctness preserved, or revising the specification with reproducible evidence; record profile results and add a regression benchmark.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

The matched-output release benchmark found a pcolormesh export gap against the existing per-family 10× Matplotlib/Agg goal in the benchmark methodology.

Workload XY total median Matplotlib total median Speedup XY tier
80 x 120 cells 14.96 ms 82.85 ms 5.54× direct

Both outputs are nonblank 1800×840 PNGs. The metric is figure construction through a completed compressed PNG, excluding imports, data generation and warm-up. XY renders this row directly. Preserve mesh geometry, normalization, colorbar behavior and seam-free cell fills.

These are diagnostic results from three repetitions on a shared workstation, with one warm-up, recorded during the 2026-11-05 release audit. Confirm the gap on a controlled runner before selecting an optimization. This does not establish a regression from v0.0.8.

Reproduce

Audited source: 5e58b12c0a1b89a58c4555af370204ef1ed0515e plus local release-validation fixes. Environment: Linux x86_64, 12 logical CPUs, CPython 3.14.6, NumPy 2.5.1, Matplotlib 3.11.0, native XY core, Rust 1.96.0.

Harness prerequisite: the audited upstream bench_pyplot_vs_matplotlib.py omits export DPI in _xy_render. Set its save call to the following before measuring, matching the Matplotlib adapter:

fig.savefig(out, format="png", dpi=EXPORT_DPI)

Both adapters build at 100 DPI and export at 200 DPI. Without that correction, the harness fails its dimension check before producing a valid comparison. The correction and output-size regression test are prepared locally on farhan/release-validation, but have not landed upstream.

cargo build --release
uv sync --extra matplotlib --group dev
uv pip install 'matplotlib==3.11.0'
MPLBACKEND=Agg uv run --no-sync python benchmarks/bench_pyplot_vs_matplotlib.py \
  --profile smoke --reps 3 --warmups 1 \
  --json /tmp/pyplot-smoke.json

The harness runs all six families; inspect the pcolormesh row. For confirmation and the existing standard target gate:

MPLBACKEND=Agg uv run --no-sync python benchmarks/bench_pyplot_vs_matplotlib.py \
  --profile standard --reps 21 --warmups 3 \
  --target-speedup 10 --require-target \
  --json /tmp/pyplot-standard.json

--require-target gates every family, so a failure in another family does not by itself establish this issue's outcome.

Raw observations
[
  {
    "library": "xy.pyplot",
    "total_samples_ms": [
      15.01132,
      14.961026,
      14.659394
    ],
    "build_median_ms": 0.396198,
    "render_median_ms": 14.516297,
    "total_median_ms": 14.961026,
    "total_p95_ms": 15.01132,
    "png_bytes": 276368
  },
  {
    "library": "matplotlib",
    "total_samples_ms": [
      82.847815,
      80.768711,
      86.329222
    ],
    "build_median_ms": 6.175336,
    "render_median_ms": 76.659255,
    "total_median_ms": 82.847815,
    "total_p95_ms": 86.329222,
    "png_bytes": 55310
  }
]
Acceptance
  • Reproduce on a controlled runner and record environment, exact commit, raw samples, output dimensions and tier decisions.
  • Profile build, rasterization and PNG encoding separately; optimize the measured bottleneck.
  • Meet the existing standard-profile 10× total-time target for pcolormesh, or explicitly revise the specification with reproducible evidence explaining why the target is not met.
  • Retain image correctness, labels and dimensions; do not achieve the target by silently reducing visual quality or dropping data.
  • Record smoke, standard and huge profile results and output sizes, and add a meaningful regression benchmark.
  • Update benchmark evidence and specifications with the resulting behavior.

The local audit report and complete raw comparison are prepared under spec/process/release-validation/2026-11-05/; they are currently uncommitted. The observations above are included here so this issue is reproducible without access to that worktree.

Lingua principale
Python
Stelle
1.9k
Fork
79
Merge medio
1g 39m
PR unite (30g)
22

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di reflex-dev/xy

Tutte le issue di reflex-dev/xy

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.