GitHub - fastuuid/fastuuid: FastUUID is a library which provides CPython bindings to Rust's UUID library (original) (raw)
fastuuid
FastUUID is a library which provides CPython bindings to Rust's UUID library.
The provided API is exactly as Python's builtin UUID class.
It is supported on Python 3.8, 3.9, 3.10, 3.11, 3.12, & 3.13.
Why?
It is much faster than Python's pure-python implementation and it is stricter when parsing hexadecimal representation of UUIDs.
If you need to generate a lot of random UUIDs we also provide the uuid4_bulk() function which releases the GIL for the entire duration of the generation. This allows other threads to run while the library generates UUIDs.
Benchmarks
processor | machine | python compiler | python implementation | python implementation version | python version | python build | release | system | cpu |
---|---|---|---|---|---|---|---|---|---|
x86_64 | x86_64 | GCC 5.5.0 | CPython | 3.7.2 | 3.7.2 | default | 4.15.0-50-generic | Linux | Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz |
name | min | max | mean | stddev | median | iqr | outliers | ops | rounds | iterations |
---|---|---|---|---|---|---|---|---|---|---|
tests/test_benchmarks.py::test_parse_bytes_fastuuid | 8.770148269832134e-07 | 3.0054012313485146e-05 | 9.848993185755912e-07 | 6.654121944953314e-07 | 9.530049283057451e-07 | 2.6979250833392143e-08 | 515;8080 | 1015332.2082162144 | 149366 | 1 |
tests/test_benchmarks.py::test_parse_bytes_uuid | 9.00006853044033e-07 | 2.4181994376704097e-05 | 1.0102117337399724e-06 | 6.361040394445994e-07 | 9.739887900650501e-07 | 3.899913281202316e-08 | 1130;10702 | 989891.4916557473 | 198020 | 1 |
tests/test_benchmarks.py::test_parse_bytes_le_fastuuid | 9.00996383279562e-07 | 2.4662993382662535e-05 | 1.0116569599011118e-06 | 5.687526428398989e-07 | 9.840005077421665e-07 | 2.200249582529068e-08 | 703;9368 | 988477.3590622543 | 163052 | 1 |
tests/test_benchmarks.py::test_parse_bytes_le_uuid | 1.348991645500064e-06 | 3.5200006095692515e-05 | 1.5184524591452776e-06 | 9.295692916442362e-07 | 1.448992406949401e-06 | 3.897002898156643e-08 | 1620;12511 | 658565.2346092485 | 170271 | 1 |
tests/test_benchmarks.py::test_parse_fields_fastuuid | 9.819923434406519e-07 | 3.2625976018607616e-05 | 1.217285795660234e-06 | 1.0234898538816672e-06 | 1.087988493964076e-06 | 6.702612154185772e-08 | 3199;12487 | 821499.7690477591 | 143844 | 1 |
tests/test_benchmarks.py::test_parse_fields_uuid | 1.1137977708131076e-06 | 0.000147809402551502 | 1.2054474234359692e-06 | 5.093104655522965e-07 | 1.144595444202423e-06 | 6.060581654310231e-08 | 2304;5896 | 829567.4954861335 | 167983 | 5 |
tests/test_benchmarks.py::test_parse_hex_fastuuid | 9.870273061096668e-07 | 2.906599547713995e-05 | 1.11212962918218e-06 | 6.906885628642859e-07 | 1.0759977158159018e-06 | 3.0995579436421394e-08 | 577;8272 | 899175.7559191765 | 143288 | 1 |
tests/test_benchmarks.py::test_parse_hex_uuid | 1.3360113371163607e-06 | 2.6262016035616398e-05 | 1.4448148991822913e-06 | 7.064083638385458e-07 | 1.3989920262247324e-06 | 2.9016518965363503e-08 | 679;4802 | 692130.1826039868 | 82156 | 1 |
tests/test_benchmarks.py::test_parse_int_uuid | 5.448004230856896e-07 | 4.164349229540676e-06 | 6.099919819231937e-07 | 2.0401652680352933e-07 | 5.548994522541762e-07 | 4.430039552971725e-08 | 3607;3925 | 1639365.8107557097 | 87951 | 20 |
tests/test_benchmarks.py::test_parse_int_fastuuid | 8.950009942054749e-07 | 4.946498665958643e-05 | 1.0105578493921953e-06 | 6.873330198387691e-07 | 9.739887900650501e-07 | 2.1012965589761734e-08 | 529;12534 | 989552.4542226401 | 176088 | 1 |
tests/test_benchmarks.py::test_fast_uuidv3 | 5.410998710431158e-07 | 3.5570512409321965e-06 | 5.971385425220447e-07 | 1.672736409563351e-07 | 5.526497261598707e-07 | 2.949964255094524e-08 | 4865;6332 | 1674653.248434526 | 83508 | 20 |
tests/test_benchmarks.py::test_uuidv3 | 3.6269775591790676e-06 | 4.193797940388322e-05 | 3.933511159797234e-06 | 1.4521217506191846e-06 | 3.782013664022088e-06 | 6.00120984017849e-08 | 548;4193 | 254225.79455743768 | 53582 | 1 |
tests/test_benchmarks.py::test_fast_uuidv4 | 1.47343598655425e-07 | 2.069187758024782e-06 | 1.6777362874701377e-07 | 7.169360028617447e-08 | 1.5453133528353646e-07 | 8.188180800061673e-09 | 6101;11550 | 5960412.297619802 | 198413 | 32 |
tests/test_benchmarks.py::test_uuidv4 | 2.275977749377489e-06 | 5.939402035437524e-05 | 2.5699563458422217e-06 | 1.316784132061215e-06 | 2.38200300373137e-06 | 1.309963408857584e-07 | 2068;5815 | 389111.667837409 | 85610 | 1 |
tests/test_benchmarks.py::test_fast_uuidv4_bulk_threads | 0.0009843519947025925 | 0.007268004992511123 | 0.0014418828965801719 | 0.0007545185495019851 | 0.0012059269938617945 | 0.0003288870066171512 | 42;54 | 693.5375975204223 | 549 | 1 |
tests/test_benchmarks.py::test_fast_uuidv4_threads | 0.0030693279986735433 | 0.008087011985480785 | 0.004009611603774935 | 0.000715605913448762 | 0.0038650799833703786 | 0.0006588477554032579 | 53;19 | 249.40071478707026 | 273 | 1 |
tests/test_benchmarks.py::test_uuidv4_threads | 0.030999513022834435 | 0.06895541000994854 | 0.040025271589084616 | 0.009975862168373506 | 0.036475206492468715 | 0.008713199000339955 | 3;2 | 24.98421522947798 | 22 | 1 |
tests/test_benchmarks.py::test_fast_uuidv5 | 5.316498572938144e-07 | 4.090600123163313e-06 | 5.890041556925782e-07 | 1.8620985914996815e-07 | 5.419497028924525e-07 | 2.9799412004649576e-08 | 3998;6415 | 1697780.8905680121 | 88921 | 20 |
tests/test_benchmarks.py::test_uuidv5 | 3.7190038710832596e-06 | 5.8079982409253716e-05 | 4.403547300216035e-06 | 2.439066121654033e-06 | 3.910012310370803e-06 | 2.169981598854065e-07 | 2283;4139 | 227089.64655629804 | 57383 | 1 |
Run them yourself to verify.
Contributing
We are running tests and build's for all target python versions for every PR.
The version number is stored in the Cargo.toml file. To release a new version, update the version number in Cargo.toml and create a new tag with the version number. Pipeline will pick it up and publish it to PyPI.
PRs are welcome.