Benchmarks#
The benchmarks/ directory contains the generic PyStormTracker performance
runner. It records the input, runtime configuration, TrackJSON output, and
machine-readable metadata; it does not download data or compare with another
implementation.
For example, to benchmark 124 frames with local Dask execution:
uv run python benchmarks/run_benchmark_detailed.py \
--input tests/data/era5/era5_msl_2025-12_2.5x2.5.nc \
--output /tmp/pystormtracker-benchmark.trackjson \
--metadata /tmp/pystormtracker-benchmark.json \
--frames 124 \
--backend dask \
--frame-workers 4 \
--sht-threads 4 \
--mge-workers 4
Benchmark results depend on the input, hardware, software environment, and execution settings.
2024 TRACK 1.5.4 comparison#
The 2024 comparison uses the same 1,464 six-hourly ERA5 MSLP frames on the F320
Gaussian grid. TRACK 1.5.4 is the implementation reference, not scientific
ground truth. PyStormTracker uses rectangular B-spline refinement with T6–42
spectral filtering. The selected PST timing profile is
frame=4 / SHT=4 / DUCC0=4; those are PST controls and have no TRACK
counterpart.
The main trajectory comparison uses the RSPLICE-filtered tracks. TRACK
ff_trs_neg and PyStormTracker filter_rsplice() outputs use the same
8-point/10° endpoint criteria. RSPLICE is postprocessing and is not included in
the tracking wall times.
Case |
Output grid |
Filtered TRACK/PST tracks |
One-to-one F1 |
Median separation |
95th-percentile separation |
|---|---|---|---|---|---|
January |
F320 → T42 |
126 / 126 |
100.0% |
3.9 m |
26.5 m |
Full year |
F320 → T42 |
1,471 / 1,471 |
99.7% |
4.1 m |
33.2 m |
January |
F320 → F320 |
132 / 132 |
100.0% |
4.7 m |
31.8 m |
Full year |
F320 → F320 |
1,544 / 1,550 |
99.7% |
4.9 m |
38.9 m |
Raw pre-RSPLICE counts and F1 are also reported for comparison.
Case |
Output grid |
Raw TRACK/PST tracks |
Raw one-to-one F1 |
|---|---|---|---|
January |
F320 → T42 |
709 / 718 |
99.4% |
Full year |
F320 → T42 |
7,761 / 7,859 |
99.2% |
January |
F320 → F320 |
779 / 789 |
99.2% |
Full year |
F320 → F320 |
8,595 / 8,747 |
98.9% |
Timing#
Each value is the median of five sequential successful end-to-end runs on an AMD Ryzen 9 5950X with 16 physical cores and 32 logical CPUs. The timing comparison is machine-specific and does not explain causation.
Period |
Output grid |
TRACK 1.5.4 |
PyStormTracker |
Relative runtime |
|---|---|---|---|---|
January |
F320 → T42 |
5.080 s |
7.230 s |
1.42× slower |
Full year |
F320 → T42 |
59.430 s |
27.480 s |
2.16× faster |
January |
F320 → F320 |
167.960 s |
11.610 s |
14.47× faster |
Full year |
F320 → F320 |
1,997.160 s |
57.380 s |
34.81× faster |
The F320 → T42 workflow reconstructs T6–42 onto a 64×128 T42 Gaussian grid. The F320 → F320 workflow reconstructs onto the native 640×1280 grid. Within each case, TRACK and PyStormTracker use the same input field, time period, T6–42 spectral-filter settings, and matching criteria.