Python中的单位转换

60 投票
13 回答
74683 浏览
提问于 2025-04-15 18:23

我正在做一个项目,让用户可以跟踪不同类型的数据随时间的变化。这个项目的基本想法是,用户应该能够使用他们需要的任何单位来输入数据。我在研究两种工具:

http://pypi.python.org/pypi/units/

http://pypi.python.org/pypi/quantities/

不过我不太确定该选择哪一个。从我了解的情况来看,quantities 似乎更复杂,但它提供了一个更全面的单位列表。

13 个回答

11

还有一个叫做 unyt 的软件包,它是由 yt-project 开发的。unyt 的作者承认了 Pint 和 astropy.units 的存在,并且支持与这两个软件包之间的转换。

unyt 的一个主要特点是 速度。它比另外两个软件包要快。关于这三个单位软件包的速度比较,可以在这篇 论文 中找到。

不过,对于那些特别关注性能的人来说,这些比较的结果可能会让人失望。:-( 使用这些单位系统进行计算时,速度会明显变慢。对于包含 1000 个条目的数组,速度降低的因素在 6 到 10 之间(对于更小的数组,情况更糟)。

声明:我与 unyt 没有任何关系,我只是想分享我对单位系统的了解。

28

Pint 最近在这个领域出现了。有没有人愿意分享一下他们的使用经验?看起来不错。顺便提一下:Pint 未来将与 Uncertainties 集成

39

我非常赞同在科学计算中使用明确的单位。使用明确的单位就像刷牙一样,虽然一开始可能有点麻烦,但从长远来看,这种类型的安全性可以避免很多麻烦。比如说,避免把价值1.25亿美元的探测器撞到行星上

你可能还想看看另外两个Python的单位/量的库:

Unum

Scientific.Physics.PhysicalQuantity

我曾经研究过Scientific.Physics.PhysicalQuantity。虽然它没有完全满足我的需求,但可能会适合你。根据你简短的描述,很难判断你需要哪些功能。

最后我自己写了一个Python包,用于单位转换和维度分析,但还没有做好发布的准备。我们在GPU加速的分子力学系统OpenMM的Python绑定中使用了我的单位系统。你可以在这里浏览我的Python单位代码的svn仓库:

SimTK python units

我最终打算将它打包以便分发。如果你觉得有趣,请告诉我。这可能会激励我更快地打包。设计SimTK python单位系统时,我寻找的功能包括:

  1. 单位在内部并不一定以国际单位制(SI)存储。这对我来说非常重要,因为我们一个重要的应用领域是在分子尺度。内部使用SI单位可能会导致在常用的分子力计算中出现指数溢出。在SimTK中,所有单位系统在内部都是同样基础的。
  2. 我希望有类似于Boost.Units系统的强大和灵活性,因为我对这个系统很熟悉,而且它是在一群优秀工程师的严格审查下设计的。Boost.Units是一个精心制作的第二代维度分析系统。因此,我可以说SimTK单位系统是一个第三代系统 :)。需要注意的是,虽然Boost.Units是一个“零开销”系统,没有运行时成本,但所有Python的量实现,包括SimTK单位,可能会有运行时成本。
  3. 我希望有维度的量能够与numpy数组兼容,但不一定需要Python的numpy包。换句话说,量可以基于numpy数组或内置的Python类型。

你觉得哪些功能对你来说很重要呢?

撰写回答