Simple, efficient and dependency-free binary (de)serialization using type annotations.
Supports easy fallback to Python's built-in struct
library for maximum performance.
pip install bstruct
from typing import Annotated
from dataclasses import dataclass
import bstruct
@dataclass
class Measurement:
timestamp: bstruct.u32 # shorthand for: Annotated[int, bstruct.Encodings.u32]
values: Annotated[list[bstruct.u8], bstruct.Array(3)]
MeasurementEncoding = bstruct.derive(Measurement)
measurement = Measurement(
timestamp=1672764049,
values=[1, 2, 3],
)
encoded = MeasurementEncoding.encode(measurement)
decoded = MeasurementEncoding.decode(encoded)
assert decoded == measurement
See the documentation for more information.
Please see the source of the benchmarks in the benchmarks
directory.
Feel free to create an issue or PR should there be a problem with the methodology.
The benchmarks where executed with
pyperf
using Python 3.11.1 and
construct 2.10.68
on a MacBook Pro 2018 with a 2.3GHz i5 processor.
Name | decode | encode |
---|---|---|
struct | 0.54 us | 0.23 us |
bstruct | 2.51 us | 1.64 us |
construct (compiled) | 9.49 us | 10.00 us |
Name | decode | encode |
---|---|---|
struct | 0.17 us | 0.33 us |
bstruct | 1.70 us | 0.59 us |
construct (compiled) | 4.04 us | 6.61 us |
Name | decode | encode |
---|---|---|
bstruct | 7.37 us | 4.81 us |
construct (compiled) | 34.5 us | 36.6 us |
Name | decode | encode |
---|---|---|
bstruct | 6.05 us | 4.42 us |
construct (compiled) | 27.6 us | 29.5 us |
I am very happy to receive any kind of feedback or contribution. Just open an issue and let me know.