A high performance Python interface to the linux kernel Reed Solomon libraries
See more on https://github.com/epeters13/pyreedsolomon
Author: Edwin G.W. Peters
Using the userspace reed-solomon interface to the Linux kernel from https://github.com/CyberLeo/reed-solomon
numpy
pip install pyreedsolomon
or
python setup.py install
This library provides fast methods where the user needs to allocate the buffers and handle padding as well as easy-to-use methods that have a slightly lower performance
import pyreedsolomon
import numpy as np
rs_dr = pyreedsolomon.Reed_Solomon(8,223,255,0x11D,0,1,32)
data = np.random.randint(0,256,150).astype(np.uint8)
data_enc = rs_dr.encode(data)
# create a few errors
err_idx = [23,53,12,97,102]
data_enc[err_idx] = 255
data_dec, n_errors = rs_dr.decode(data_enc)
verify = np.all(data_dec==data)
print(f"Decoding succes: {verify}. errors corrected {n_errors}")
For more examples including how to use the fast encoder and decoder that omits variable checking, check tests/bench.py
Performance comparison of pyreedsolomon with different input data types and comparison to unireedsolomon and reedsolo Input data types supported:
- numpy.ndarray
- list
- bytes
- bytearray
Test run on Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
RS (973, 935, 10) -- encoding and decoding 1000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 0.065 s 0.065 ms each | 0.061 s 0.061 ms each | 0 |
pyreedsolomon list | 0.114 s 0.114 ms each | 0.117 s 0.117 ms each | 0 |
pyreedsolomon bytearray | 0.067 s 0.067 ms each | 0.060 s 0.060 ms each | 0 |
pyreedsolomon bytes | 0.063 s 0.063 ms each | 0.060 s 0.060 ms each | 0 |
pyreedsolomon fast | 0.064 s 0.064 ms each | 0.056 s 0.056 ms each | 0 |
py unireedsolomon | 8.828 s 8.828 ms each | 6.830 s 6.830 ms each | 0 |
RS (255, 223, 8) -- encoding and decoding 10000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 0.189 s 0.019 ms each | 0.200 s 0.020 ms each | 0 |
pyreedsolomon list | 0.339 s 0.034 ms each | 0.385 s 0.038 ms each | 0 |
pyreedsolomon bytearray | 0.201 s 0.020 ms each | 0.231 s 0.023 ms each | 0 |
pyreedsolomon bytes | 0.190 s 0.019 ms each | 0.225 s 0.023 ms each | 0 |
pyreedsolomon fast | 0.166 s 0.017 ms each | 0.196 s 0.020 ms each | 0 |
py unireedsolomon | 12.233 s 1.223 ms each | 12.556 s 1.256 ms each | 0 |
py reedsolo | 9.292 s 0.929 ms each | 16.142 s 1.614 ms each | 0 |
RS (15, 11, 4) -- encoding and decoding 100000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 0.755 s 0.008 ms each | 0.787 s 0.008 ms each | 0 |
pyreedsolomon list | 1.039 s 0.010 ms each | 1.132 s 0.011 ms each | 0 |
pyreedsolomon bytearray | 0.823 s 0.008 ms each | 0.869 s 0.009 ms each | 0 |
pyreedsolomon bytes | 0.773 s 0.008 ms each | 0.851 s 0.009 ms each | 0 |
pyreedsolomon fast | 0.538 s 0.005 ms each | 0.574 s 0.006 ms each | 0 |
py unireedsolomon | 1.921 s 0.019 ms each | 2.661 s 0.027 ms each | 0 |
py reedsolo | 1.255 s 0.013 ms each | 1.659 s 0.017 ms each | 0 |
Test run on Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
RS (973, 935, 10) -- encoding and decoding 1000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 0.081 s 0.081 ms each | 0.077 s 0.077 ms each | 0 |
pyreedsolomon list | 0.173 s 0.173 ms each | 0.147 s 0.147 ms each | 0 |
pyreedsolomon bytearray | 0.082 s 0.082 ms each | 0.079 s 0.079 ms each | 0 |
pyreedsolomon bytes | 0.080 s 0.080 ms each | 0.078 s 0.078 ms each | 0 |
pyreedsolomon fast | 0.076 s 0.076 ms each | 0.073 s 0.073 ms each | 0 |
py unireedsolomon | 10.175 s 10.175 ms each | 8.111 s 8.111 ms each | 0 |
RS (255, 223, 8) -- encoding and decoding 10000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 0.286 s 0.029 ms each | 0.319 s 0.032 ms each | 0 |
pyreedsolomon list | 0.475 s 0.048 ms each | 0.542 s 0.054 ms each | 0 |
pyreedsolomon bytearray | 0.277 s 0.028 ms each | 0.356 s 0.036 ms each | 0 |
pyreedsolomon bytes | 0.272 s 0.027 ms each | 0.328 s 0.033 ms each | 0 |
pyreedsolomon fast | 0.232 s 0.023 ms each | 0.280 s 0.028 ms each | 0 |
py unireedsolomon | 13.396 s 1.340 ms each | 13.963 s 1.396 ms each | 0 |
py reedsolo | 12.086 s 1.209 ms each | 24.035 s 2.404 ms each | 0 |
RS (15, 11, 4) -- encoding and decoding 100000 runs
test name | encoding | decoding | num errors |
---|---|---|---|
pyreedsolomon numpy.ndarray | 1.365 s 0.014 ms each | 1.453 s 0.015 ms each | 0 |
pyreedsolomon list | 1.759 s 0.018 ms each | 1.900 s 0.019 ms each | 0 |
pyreedsolomon bytearray | 1.452 s 0.015 ms each | 1.613 s 0.016 ms each | 0 |
pyreedsolomon bytes | 1.409 s 0.014 ms each | 1.521 s 0.015 ms each | 0 |
pyreedsolomon fast | 1.069 s 0.011 ms each | 1.015 s 0.010 ms each | 0 |
py unireedsolomon | 2.626 s 0.026 ms each | 4.015 s 0.040 ms each | 0 |
py reedsolo | 1.991 s 0.020 ms each | 2.753 s 0.028 ms each | 0 |