jcrist · GitHub

This adds support for encoding/decoding UUIDs as strings in the format described by RFC4122.

The encoding and decoding are done as efficiently as possible - on my machine UUIDs

In [1]: import msgspec, orjson, pydantic, uuid
In [2]: class Struct(msgspec.Struct):
   ...:     data: list[uuid.UUID]
   ...:
In [3]: class Model(pydantic.BaseModel):
   ...:     data: list[uuid.UUID]
   ...:
In [4]: data = [uuid.uuid4() for _ in range(5000)]
In [5]: struct = Struct(data=data)
In [6]: model = Model(data=data)
In [7]: enc = msgspec.json.Encoder()
In [8]: dec = msgspec.json.Decoder(Struct)
In [9]: msg = enc.encode(struct)
In [10]: %timeit enc.encode(struct)  # msgspec encode time
252 µs ± 4.32 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
In [11]: %timeit orjson.dumps(data)  # orjson encode time
537 µs ± 1.99 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
In [12]: %timeit model.json()  # pydantic encode time
18 ms ± 37.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [13]: %timeit dec.decode(msg)  # msgspec decode time
1.07 ms ± 4.45 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
In [14]: %timeit Model.parse_raw(msg)  # pydantic decode time
11.3 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Read the original on github.com ↗