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

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 10-90x faster than pint on common operations. Benchmarks on Python 3.13 (lower is better):

Operation pintrs pint Speedup
Quantity creation 0.35 us 3.64 us 10x
Parse string ("9.81 m/s**2") 0.74 us 70.61 us 96x
Conversion (km -> m) 1.19 us 8.08 us 7x
Conversion (km/h -> m/s) 1.68 us 14.11 us 8x
Addition (compatible units) 0.94 us 12.66 us 13x
Multiply by scalar 0.13 us 5.59 us 41x
Multiply quantities 0.17 us 5.38 us 31x
Parse units ("kg * m / s ** 2") 0.95 us 23.66 us 25x
String formatting 0.29 us 8.58 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
  • Compatibility stubs for Context, Group, System so existing code doesn't break

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/Group/System stubs (API-compatible, no-op)

Not yet implemented: full context-based conversions (spectroscopy, etc.), Babel/locale formatting, logarithmic units, pandas ExtensionArray integration.

Development

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

# Lint and format
ruff check --fix . && ruff format .

# 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.6.tar.gz (60.1 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.6-cp313-cp313-win_amd64.whl (369.0 kB view details)

Uploaded CPython 3.13Windows x86-64

pintrs-0.1.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (519.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pintrs-0.1.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (507.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

pintrs-0.1.6-cp313-cp313-macosx_11_0_arm64.whl (464.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pintrs-0.1.6-cp313-cp313-macosx_10_12_x86_64.whl (488.6 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

pintrs-0.1.6-cp312-cp312-win_amd64.whl (369.7 kB view details)

Uploaded CPython 3.12Windows x86-64

pintrs-0.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (520.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pintrs-0.1.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (508.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

pintrs-0.1.6-cp312-cp312-macosx_11_0_arm64.whl (464.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pintrs-0.1.6-cp312-cp312-macosx_10_12_x86_64.whl (489.0 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for pintrs-0.1.6.tar.gz
Algorithm Hash digest
SHA256 483baa10c96dd70a7c958c5a1775fb1fdeb28f404b832e2b8ff43e557c6c8b4a
MD5 c9645890c851e80df2518f9f5590b39c
BLAKE2b-256 ad84212d3741a76246fecf20947b1e640580ab454ef759ea6817f7d7569e717e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pintrs-0.1.6-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 369.0 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.6-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7defe0baf63cb7ef1f60f870d0c0c35c3893a21aadb631c4a69f1ffe70e22340
MD5 2e7d2831cff6da069c4288b0fc79cff0
BLAKE2b-256 8703629f69d550dd89ca08e90c25359287da19952bd6ed149b447d6bd509e4ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8af54e5354cb450083ae64b1f11d08866b762e26819bd0665e4d0e029b100720
MD5 2ff641a3301c06a834bf75070c8cc87c
BLAKE2b-256 02ec9b6f86dfaee895507b0d3fbd02a4346ce29f1c88277b1177aa645bf81f30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 edac315d172fe9f3eb358fb57d1540333d6cb1844512f747c6b05013a739bd7c
MD5 526a1d4cab276283276ea0033953b47f
BLAKE2b-256 4be7b3b8b635e44c3e33d9ae2d640665711cbee3858f668a1c840a6b6da8248b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 945eadb69a4b5e5a843a48bb56ab95a25cc031b580e62cb6416422ff376f1577
MD5 6dc517d74e17364e4a4ad6c0f02c1707
BLAKE2b-256 0370ef9a9dbeab484bd7d232969c707729b59aca08eeac750a9553480c6b688e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cebf380d353eb473f9919d99eda0af90de4db6fb9e5e967d50aa32ad163ccd92
MD5 7f7c708c63acd6a48d69be7121de87ce
BLAKE2b-256 2e0d353e8c5224256aa6ffa0612f3e8322e315d60af687053c6002d777fe5390

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pintrs-0.1.6-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 369.7 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.6-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3abb8245d1b8f91e763db979d90f52967a767f149df1cbcdde95f4367a8e567d
MD5 ae80da9fea4b357507a03cbf247ad440
BLAKE2b-256 3800df726f0bb1c61e6221aacef6eeb5be4e9153764c6f17b71d0450506f0b60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d0377a859e80208c33ec462bb3565e6b7c37e6bc5908b69aed48cd6f45fa457
MD5 c0943703d3afebfef7e4b32163dcbfc5
BLAKE2b-256 613dafcd52dea01c79202e7a0fd172c51cc7ea09a9ccee05f0101f94c6a9a558

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 cfbf8b4080d42df894ff9c6d76efa9755e50c7caef69cc0d5edcecceffbc1777
MD5 157edcaee048bd09188ae8ef0cf00099
BLAKE2b-256 ac84f955dc58d10510fe83c3f59be3b19e45666fe43ae3645dd86f61c49daf0f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c13770b67e124edf551aa6b9f34792c29e47d2c466ef56847c35087e873979da
MD5 28774fc2e1acc95615a8553ea9dac906
BLAKE2b-256 d607612537d96aa7e6315e42ac7ab71657f07e87d0280618c6937c72b433a753

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pintrs-0.1.6-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a7ba3d44536826ba3c52797e699abad7762fc8ea4c13b540b621bd1dec0101d3
MD5 d0fb1b799523d5685ab2925ec3a4665f
BLAKE2b-256 de7f04a23ebbf41fe7e366dd3d158602822d2f9213313917de96a737e45041ba

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