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 4Benchmark results depend on the input, hardware, software environment, and execution settings.
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% |
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.