Skip to content

Benchmarks

Wickra is a streaming-first library: the state machine inside every indicator can take a single new tick and return its updated output in constant time. The numbers below show what that costs in wall-clock time relative to the most-used Python TA libraries.

Reproduce these on your own hardware

bash
pip install -e bindings/python[bench]
python -m benchmarks.compare_libraries

The script auto-detects every peer library installed in your venv and runs them against the same generated input as Wickra. The CI job cross-library-bench uploads the raw report as an artefact on every push.

Batch — single full pass over 20 000 bars

Lower bar = faster. The orange bar is Wickra, the grey bar is the peer.

vs. finta

SMA(20)
95.6µs
343.5 µs
3.6× faster
EMA(20)
64.6µs
223.1 µs
3.5× faster
RSI(14)
126.2µs
1107.1 µs
8.8× faster
MACD(12,26,9)
119.0µs
531.8 µs
4.5× faster
Bollinger(20,2.0)
105.3µs
812.0 µs
7.7× faster
ATR(14)
123.5µs
5144.8 µs
41.7× faster

vs. talipp

SMA(20)
95.6µs
7640.6 µs
79.9× faster
EMA(20)
64.6µs
12160.9 µs
188.2× faster
RSI(14)
126.2µs
15792.2 µs
125.1× faster
MACD(12,26,9)
119.0µs
49788.1 µs
418.4× faster
Bollinger(20,2.0)
105.3µs
130938.3 µs
1243.5× faster
ATR(14)
123.5µs
28816.0 µs
233.3× faster

Streaming — per-tick latency after 5 000 historical bars

This is where streaming-first really shows. A batch-only library has to re-run its full indicator over the entire history on every new tick; Wickra advances its internal state by one step.

RSI(14)
0.1µs / tick
1.6 µs / tick
13.8× faster

Why isn't TA-Lib / pandas-ta on these charts?

Both fail to install cleanly on Windows without C build tooling — which is precisely the install-pain Wickra was built to remove. The bench script auto-detects every peer library it can find and runs them on the same inputs as Wickra; install them in your environment and those rows will show up too.

What the numbers do not say

  • Absolute µs values depend on CPU, memory clock, OS scheduler, and the Python / Node / Rust versions — read them as relative speedups between libraries on identical input, not as a universal performance contract.
  • Reproduced on: Windows 11 Pro 26200, AMD Ryzen 9 9950X, 64 GB DDR5, Rust 1.92 (release profile, lto = "fat", codegen-units = 1), Python 3.12, Node 20.
  • The Wickra figures are the Python binding runtime, not the bare Rust kernel — there is a small PyO3 boundary cost included on each measurement.

See also

Updated: