Skip to content

Uncertainty ranges benchmarks ​

24 of 24 cases match Python Prophet.

Both libraries simulate possible futures with random draws, so individual simulated values never match. Each range must still match Python's within the variation expected from that many draws, on every trend type. Anomaly cases also check that both libraries flag the outliers in a history.

Each case runs the same input through Effect Prophet and Python Prophet 1.4.0, then compares every forecast row, the trend, each component and the fitted noise. A case matches when all of them agree within its tolerances, and only matching cases are timed.

Each case's dot shows its result: matches, matches with internal differences flagged, intentional difference, doesn't match. Hover over a dot for details.

How to read the tables:

  • Effect output and Python output are each library's final forecast value. Open a case to see every row side by side.
  • Largest difference is the biggest gap between the two forecasts, as a share of the input data's range.
  • Effect time and Python time are the median time for the timed step, usually fitting and predicting. Open a case for every step, including first-run and save/load times.
  • A timed step marked different work calls public operations that produce different outputs in the two libraries, so its times aren't a speed comparison. The case page explains the difference.
  • Flagged cases match, but the two libraries stopped their fitting search at slightly different points. The case page shows the internal numbers.
About these runs

Each trend's cases come from that trend's own run.

Linear growth

  • Run 2026-11-07T174133-142Z-3a5a6cec on 2026-11-07, commit 3a5a6ce
  • Both libraries ran in linux/arm64 containers on Apple M4 Pro
  • effect-prophet 0.0.0
  • effect 4.0.6
  • prophet 1.4.0
  • Full benchmark report

Flat growth

  • Run 2026-11-07T181422-912Z-3a5a6cec on 2026-11-07, commit 3a5a6ce
  • Both libraries ran in linux/arm64 containers on Apple M4 Pro
  • effect-prophet 0.0.0
  • effect 4.0.6
  • prophet 1.4.0
  • Full benchmark report

Logistic growth

  • Run 2026-11-07T184211-397Z-3a5a6cec on 2026-11-07, commit 3a5a6ce
  • Both libraries ran in linux/arm64 containers on Apple M4 Pro
  • effect-prophet 0.0.0
  • effect 4.0.6
  • prophet 1.4.0
  • Full benchmark report

Timings come from one machine and describe this workload only. They are not a general speed ranking. Where Python is faster, it is often because Python runs Stan's optimizer as compiled C++, while Effect Prophet runs the same algorithm as WebAssembly with narrower vector instructions. The gap is widest for Newton's method on short histories with many parameters.

Linear growth ​

Both libraries simulate possible futures with random draws, so individual simulated values never match. Each range must still match Python's within the variation expected from that many draws. Anomaly cases also check that both libraries flag the outliers in a history. All linear growth benchmarks →

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Ranges with a forecast regressor256 rows139.2608139.26480.0040%Simulate uncertainty (different work)9.28 ms246 ms
Defaults, three years of ranges1095 rows611.2687611.31560.011%Simulate uncertainty (different work)69.7 ms375 ms
Defaults, ranges on irregular dates192 rows108.5108108.43200.15%Simulate uncertainty (different work)11.4 ms158 ms
Samples with repeated timestamps96 rows17.903917.90390.0013%Simulate uncertainty (different work)471 µs16.8 ms
Ranges over past dates96 rows110.0950110.0950< 0.0001%Simulate uncertainty (different work)331 µs19.8 ms
Samples for one future date96 rows110.0819110.0819< 0.0001%Simulate uncertainty (different work)204 µs16.8 ms
Ranges with mixed effects96 rows45.135345.1353< 0.0001%Simulate uncertainty (different work)487 µs26.4 ms
Samples with mixed effects96 rows45.135345.1353< 0.0001%Simulate uncertainty (different work)798 µs68.6 ms
Anomalies in a history365 rows149.0161148.99470.11%Fit and find anomalies25.2 ms199 ms

Flat growth ​

Both libraries simulate possible futures with random draws, so individual simulated values never match. Each range must still match Python's within the variation expected from that many draws. Anomaly cases also check that both libraries flag the outliers in a history. All flat growth benchmarks →

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Country calendar uncertainty replay96 rows21.444721.44460.0048%Simulate uncertainty (different work)341 µs14.7 ms
Ranges with a forecast regressor730 rows24.024824.02470.0020%Simulate uncertainty (different work)18.1 ms277 ms
Anomalies in a history180 rows34.057934.0579< 0.0001%Fit and find anomalies10.4 ms133 ms
Defaults, ranges with a weekly pattern96 rows35.002535.0025< 0.0001%Simulate uncertainty (different work)4.83 ms129 ms
Ranges with mixed effects96 rows35.028335.0283< 0.0001%Simulate uncertainty (different work)985 µs72.1 ms
Samples, eight months256 rows19.530519.5305< 0.0001%Simulate uncertainty (different work)860 µs20.2 ms

Logistic growth ​

Both libraries simulate possible futures with random draws, so individual simulated values never match. Each range must still match Python's within the variation expected from that many draws. Anomaly cases also check that both libraries flag the outliers in a history. All logistic growth benchmarks →

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Anomalies in a history365 rows157.6301157.62720.073%Fit and find anomalies71.6 ms298 ms
Defaults, ranges with changing growth365 rows193.9557193.95230.0086%Simulate uncertainty (different work)23.3 ms293 ms
Defaults, ranges with changing growth, second seed365 rows193.9557193.95230.0086%Simulate uncertainty (different work)23.5 ms298 ms
Samples, weekly pattern96 rows71.906071.9060< 0.0001%Simulate uncertainty (different work)1.22 ms80.4 ms
Ranges, eight months256 rows98.080498.0804< 0.0001%Simulate uncertainty (different work)1.55 ms25.9 ms
Ranges with an explicit floor96 rows72.219072.2190< 0.0001%Simulate uncertainty (different work)1.01 ms92.3 ms
Samples with an explicit floor96 rows72.219072.2190< 0.0001%Simulate uncertainty (different work)733 µs24.1 ms
Ranges with mixed effects96 rows72.227072.2270< 0.0001%Simulate uncertainty (different work)760 µs30.3 ms
Samples with mixed effects96 rows72.227072.2270< 0.0001%Simulate uncertainty (different work)759 µs25.1 ms

Inspired by Prophet from Meta. Not affiliated with Meta.