Pint:Python 物理量计算的零依赖方案

Pint 在 GitHub 上已经拿到 2,742 Star 了。

这是一个专门处理物理量的 Python 库。把数值和单位绑定在一起,做运算的时候自动处理单位转换,出错的时候会直接抛异常,而不是给你返回一个莫名其妙的数字。

正文顶部截图

1、 这玩意儿是干嘛的

科学计算和工程开发里,单位换算是个老问题。把米和厘米加在一起、把摄氏度直接当成开尔文用,这种错误写出来很蠢,但真的很容易发生。

Pint 的做法很简单:给每个数值包上一层单位信息,让它成为一个「物理量」。两个物理量做运算时,Pint 自动检查单位是否兼容,不兼容就报错,兼容就自动换算到合适的单位。

>>> import pint
>>> ureg = pint.UnitRegistry()
>>> 3 * ureg.meter + 4 * ureg.cm
Quantity(3.04, "meter")

几行代码就能上手。不需要改现有代码的结构,也不用去记一堆单位换算系数。

README区域截图

2、 为什么要用它

市面上处理单位的库不少,Pint 有几个实际的好处。

不需要依赖。纯 Python 实现,标准库就能跑,Python 3.9 以上都支持。你不需要为了加个单位功能去拉一堆额外的包。

NumPy 友好。 ndarray 可以直接参与运算,Pint 不会用 monkey patch 或者包装层去篡改 numpy 的行为。你原来的 numpy 代码该怎么写还怎么写,单位是附加能力,不是侵入式改造。

单位定义可扩展。内置了物理单位、前缀、常量等完整列表,都是从文本文件加载的。你觉得缺了什么单位,或者行业里有特殊定义,改文本文件就行,不用去动源码。

数值类型不限定。int、float、Decimal、Fraction、numpy.ndarray 都可以作为物理量的数值部分。你用什么精度,Pint 就按什么精度走。

>>> import numpy as np
>>> [3, 4] * ureg.meter + [4, 3] * ureg.cm
Quantity([ 3.04  4.03], "meter")
>>> np.sum(_)
Quantity(7.07, "meter")

3、 安装

pip 直接装:

pip install pint

conda 用户用 conda-forge 频道:

conda install -c conda-forge pint

装完之后就可以用了,没有额外的配置步骤。

4、 设计上的几个特点

自动识别复合单位。定义了 kilo 和 meter,Pint 就自动认识 kilometers。不需要你把每一种变体都单独写进配置里,单位定义列表可以维持得很短。

字符串格式化。支持 PEP 3101 语法,还能输出 LaTeX 格式和美化格式。做报告、写论文的时候,物理量可以直接插入到排版流程里。

温度换算。摄氏、华氏、开尔文之间的转换不是简单的线性关系,Pint 会正确处理带参考点的单位换算。

不确定性传递。配合 uncertainties 包,可以处理带误差的物理量运算,误差会自动传播到结果中。

Pandas 兼容。通过 Pandas Extension Types 集成,DataFrame 里的列可以带单位信息,列之间的运算也会自动做单位检查。

5、 适合哪些人用

  • 做科学计算、工程建模,需要严格单位管理的开发者
  • 数据处理流程里涉及多种单位换算,想减少人为失误的团队
  • 用 NumPy 或 Pandas 做分析,希望单位校验不破坏现有代码结构的人

Pint 的定位很务实:不追求大而全,把「物理量的定义和运算」这一件事做好。如果你写 Python 的时候经常跟单位打交道,它值得试试。

现有代码结构的人

Pint 的定位很务实:不追求大而全,把「物理量的定义和运算」这一件事做好。如果你写 Python 的时候经常跟单位打交道,它值得试试。

更多推荐