Implemented in Rust with a Python interface. The performance gain measured against the widely used Python/numpy implementation that comes with obspy approaches approximately a factor of 2.5 for large and 10 for small vectors (see Benchmarks).
Installation from pypi:
pip install konnoohmachi
Installation from source:
pip install .
This smoothes some random numbers:
import konnoohmachi
bandwidth = 40
# using fake random data
frequencies = np.arange(1000)
amplitudes = np.random.rand(1000)
smoothed_amplitudes = konnoohmachi.smooth(frequencies, amplitudes, bandwidth)
use konnoohmachi;
let frequencies = Array1::<f64>::zeros(10);
let amplitudes = Array1::<f64>::ones(10);
let bandwidth = 40.0;
konnoohmachi_smooth(
frequencies.view().into_dyn(),
amplitudes.view().into_dyn(),
bandwidth,
);
Measuring the execution time based of increasing sized spectra yields:
❯ python3 benchmark.py
nsamples | Rust | Python | Performance Gain
----------------------------------------------------------
256 | 0.00017 | 0.00192 | 11.30802
512 | 0.00054 | 0.00431 | 7.97596
1024 | 0.00198 | 0.01117 | 5.63623
2048 | 0.00775 | 0.03143 | 4.05371
4096 | 0.03067 | 0.10024 | 3.26844
8192 | 0.12212 | 0.35058 | 2.87080
16384 | 0.49391 | 1.29653 | 2.62506
32768 | 1.98499 | 5.05335 | 2.54578