降低Python中的浮点精度以提高性能

2 投票
2 回答
2668 浏览
提问于 2025-04-18 12:36

我正在用Python在树莓派上工作。我使用互补滤波器来从陀螺仪获取更好的数值,但这消耗了树莓派太多的电力——大约70%。我想通过减少浮点数的精度来提高性能。现在的结果有大约12位小数,这远远超过了我的需求。有没有办法设置最大精度?单纯四舍五入数字并不能满足我的需求,因为这又是一种计算。谢谢!

编辑:我尝试使用Decimal模块,设置精度为6时,它的速度几乎比浮点数慢了6倍!有没有其他方法可以处理定点数,而不是使用Decimal(看起来它是为了更高的精度而设计的,而不是为了性能)

2 个回答

3

可能你理解错了。

陀螺仪的数据流动速度比较慢,所以你有足够的时间用任何合理的过滤器来处理这些数据。甚至连卡尔曼滤波器都可以用(虽然可能没必要)。你多久采样一次陀螺仪和加速度计的数据?合理的最大值是几百赫兹,不要超过这个。

加速度计和陀螺仪的互补滤波器非常轻量级,使用它几乎不会消耗太多的处理能力。它可以在慢速的8位处理器上实现,所以树莓派用它完全是绰绰有余。

根据你使用互补滤波器的方式,这个滤波器本身需要进行一些浮点运算。如果你计算反正切或类似的函数,那就需要几百次浮点运算。如果你以1 kHz的频率进行这样的计算,可能会消耗几百kFLOPS(每秒浮点运算次数)。而树莓派的浮点运算能力大约是100 MLFOPS,所以还有很大的余地。

因此,降低浮点运算的精度并不会有太大帮助,问题可能出在其他地方。如果你能多分享一些代码,或许能找到问题所在!

3

你可以通过numpy强制使用单精度浮点数进行计算。

不过,我会很惊讶如果单精度浮点数的计算速度比双精度快:树莓派有硬件支持浮点运算,所以我认为所有的计算都是以完整的80位精度进行的,然后在保存到内存时再四舍五入到32位或64位的结果。唯一可能的好处就是在保存这些值时,使用的内存带宽会稍微少一些。

撰写回答