Skip to main content

Fast Rust-based Python extension for physical unit manipulation

Project description

pintrs

A fast, Rust-powered drop-in replacement for pint -- the Python physical units library.

pintrs reimplements pint's core unit registry and quantity system in Rust via PyO3, giving you the same Python API with significantly better performance.

Installation

pip install pintrs

Optional integrations:

pip install "pintrs[numpy]"
pip install "pintrs[pandas]"
pip install "pintrs[babel]"
pip install "pintrs[all]"

Quick start

from pintrs import UnitRegistry

ureg = UnitRegistry()

# Create quantities
distance = ureg.Quantity(5.0, "kilometer")
time = ureg.Quantity(2.0, "hour")

# Arithmetic with automatic unit tracking
speed = distance / time
print(speed)           # 2.5 kilometer / hour
print(speed.to("m/s")) # 0.6944... meter / second

# Attribute-style access
print(ureg.meter)      # 1 meter
print(ureg.speed_of_light)

Performance

pintrs is typically 7-100x faster than pint on common operations. Benchmarks below were measured on this branch with Python 3.13.5 (lower is better):

Operation pintrs pint Speedup
Quantity creation 0.35 us 3.65 us 10x
Parse string ("9.81 m/s**2") 0.67 us 70.12 us 104x
Conversion (km -> m) 1.18 us 7.84 us 7x
Conversion (km/h -> m/s) 1.75 us 13.80 us 8x
Addition (compatible units) 0.88 us 12.01 us 14x
Multiply by scalar 0.13 us 5.88 us 46x
Multiply quantities 0.16 us 5.44 us 33x
Parse units ("kg * m / s ** 2") 0.88 us 23.66 us 27x
String formatting 0.29 us 8.41 us 29x

Run python examples/benchmark.py to reproduce (install pint for comparison).

Features

  • Drop-in replacement for pint's UnitRegistry, Quantity, Unit, and common operations
  • NumPy support via ArrayQuantity with full ufunc integration
  • Type-safe with full .pyi stubs for mypy and pyright in strict mode
  • Measurement support for quantities with uncertainty propagation
  • Context, Group, and System support for context-based conversions, unit collections, and coherent unit systems

NumPy integration

import numpy as np
from pintrs import UnitRegistry
from pintrs.numpy_support import ArrayQuantity

ureg = UnitRegistry()

distances = ArrayQuantity(np.array([1.0, 2.0, 3.0]), "kilometer", ureg)
result = distances.to("meter")
print(result.magnitude)  # [1000. 2000. 3000.]

# NumPy ufuncs work transparently
print(np.sqrt(ArrayQuantity(np.array([4.0, 9.0]), "m**2", ureg)))

Measurements (uncertainty)

from pintrs import Measurement, Quantity

m = Measurement(Quantity(100.0, "meter"), 0.5)
print(m)       # 100.0 +/- 0.5 meter
print(m.rel)   # 0.005

# Error propagation (adds in quadrature)
m2 = Measurement(Quantity(50.0, "meter"), 0.3)
print(m + m2)

Decorators

from pintrs import UnitRegistry, wraps, check

ureg = UnitRegistry()

@wraps(ureg, ret="meter/second", args=("meter", "second"))
def speed(distance, time):
    return distance / time

result = speed(ureg.Quantity(100, "km"), ureg.Quantity(2, "hour"))
print(result)  # in m/s

@check(ureg, "[length]", "[time]")
def velocity(d, t):
    return d / t

Custom units

ureg = UnitRegistry()
ureg.define("smoot = 1.7018 * meter")
print(ureg.Quantity(1, "smoot").to("meter"))  # 1.7018 meter

Compatibility with pint

pintrs targets API compatibility with pint's most-used features:

  • UnitRegistry, Quantity, Unit with full arithmetic
  • Unit parsing, conversion, base/root/compact/reduced/preferred units
  • __getattr__ on registry (ureg.meter, ureg.speed_of_light)
  • Serialization via __reduce__ (pickle) and to_tuple/from_tuple
  • wraps and check decorators
  • Measurement with uncertainty propagation
  • Context-based conversions (spectroscopy, Boltzmann, chemistry)
  • Group (named unit collections: imperial, metric, cgs, US_customary)
  • System (coherent unit sets: mks/SI, cgs, imperial, Gaussian, atomic)
  • Babel/locale formatting (format_babel)
  • Logarithmic units (LogarithmicQuantity for dB/dBm/dBW/Np/Bel)
  • Pandas ExtensionArray integration (PintArray/PintDtype)

Development

# Build (requires Rust toolchain and maturin)
maturin develop --release

# Lint and format
ruff check --fix python/ tests/
ruff format python/ tests/

# Type check
mypy python/pintrs/
pyright python/pintrs/

# Test
pytest

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pintrs-0.1.8.tar.gz (106.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pintrs-0.1.8-cp313-cp313-win_amd64.whl (393.3 kB view details)

Uploaded CPython 3.13Windows x86-64

pintrs-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (543.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pintrs-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (531.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

pintrs-0.1.8-cp313-cp313-macosx_11_0_arm64.whl (488.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pintrs-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl (512.4 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

pintrs-0.1.8-cp312-cp312-win_amd64.whl (394.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pintrs-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (544.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pintrs-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (532.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

pintrs-0.1.8-cp312-cp312-macosx_11_0_arm64.whl (488.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pintrs-0.1.8-cp312-cp312-macosx_10_12_x86_64.whl (512.8 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

Details for the file pintrs-0.1.8.tar.gz.

File metadata

  • Download URL: pintrs-0.1.8.tar.gz
  • Upload date:
  • Size: 106.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for pintrs-0.1.8.tar.gz
Algorithm Hash digest
SHA256 e3f3db54b66b13c2a6f7f249ccf3619929d2c1c76672efba9c517cbf1ea720c8
MD5 0f2b2f09cbea2002ab4b1e35fb845352
BLAKE2b-256 ab13b6c77720b50800443aa86fa8c5145a3ead92682cf3d529c6b547a8514966

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pintrs-0.1.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 393.3 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for pintrs-0.1.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a3fd0ab577add83e79d25db162e3acde95bf7ac691986cd2cf3d41af6a57c47b
MD5 58da1f87a631208890edf72f17634397
BLAKE2b-256 3b47a1a2a7abf99564e479be6de213d936070b6b0d572402b6f774d0ca921689

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 71c88a934f2bf968e2e58ac91accb4c8978186475022b549654a0cb97dde400a
MD5 db2833897315ae80e176f07f5ad7a931
BLAKE2b-256 01c6d85fcee5a780be5992d48fe483aabfaac084337913d1a82c0e9dc416f097

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1db450a2864fbc06f9285a8082c4e09246989ccae93d3cc81d8a9a69014dba20
MD5 60015788d48a93c4f18038b697f1ca9a
BLAKE2b-256 dafde85c3ea114e6b05fdc5d7be66090e9f436890a046526052cc591d9488e12

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 698d573da60da8ab9bd3715fb1597187dcb85ef3a480967eeae169cedd1dbc1c
MD5 ac3e6f3beb09376e2154759c9d2f6dfd
BLAKE2b-256 87552d5e39689736da13b08c74fe33a2c3efade462e61ce27684446f97134a85

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 244128ce59a83dcd11f9379820b01a1c628c0c7b7cdb83b7358533c5f156542a
MD5 f790bfd3866f7163e94313c85117704e
BLAKE2b-256 78478af4d66f299a2922c299169fbf51552571ef4e8acdf704b095147d4ca507

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pintrs-0.1.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 394.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.6

File hashes

Hashes for pintrs-0.1.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 2f157e2238ddc40a1bddfeae73cd721fb0b16159453352ff4b80a9b6b1d21771
MD5 4d9720f3272c103520ec01209330706b
BLAKE2b-256 0ee5a8574e1867580aa1268e47c111b1d71b5702db263f868901839a76184806

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2963ac8f088ce6485a0151d1e8f5a6e7908137722fd783a71afb0c8ccf72a3f0
MD5 e06d34225db5a9de141d4940133a7ee3
BLAKE2b-256 43059d7495e4bec47ccfc58c9018eafe5d953ecfe76c4959b4872099bffd7fec

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b811e454fe3c6fec3ed12a8c7b7cd5318d3703ca6a4ee8e5aeef4cb348440016
MD5 09f05b53cc1b70c92920887248ca4a4f
BLAKE2b-256 5a13cb98cafc70dcd9fdb7aeacc8c226cb5059ef15c22cc3cd38eab18a484238

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 25327a3f49da759816fefefc932a5b909f7a539c1beb4333666e9323af441a25
MD5 2df7ef72e27a34356cc61179e6439206
BLAKE2b-256 2cb9ff6eb5f3f4b07dec53d00b30eb0923709fc9675ce95046028568f2566152

See more details on using hashes here.

File details

Details for the file pintrs-0.1.8-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pintrs-0.1.8-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 abfadde0aac8c468c8242e547f586ab6129b4a26e5b69e76c5eaf021db49fb9c
MD5 556a0452d8eb305a5a69503f6168f7e6
BLAKE2b-256 bda93fc847fcf014689914a85678259032365a41fc5bef1ce85e951b709b2147

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page