繁体   English   中英

Python float精度浮点数

[英]Python float precision float

我需要实现一个动态编程算法来及时解决旅行商问题,这比Brute Force Search计算点之间的距离要好。 为此,我需要按大小索引子问题,每个子问题的值将是一个浮点数(游览的长度)。 然而,如果我使用python浮点数(实际上具有双精度),将数组保存在内存中将占用大约6GB RAM,因此尝试将该数量减半(我只有4GB RAM)我将需要使用单精度浮点数。 但是我不知道如何在Python中获得单精度浮点数(我使用的是Python 3)。 有人可以告诉我在哪里可以找到它们(我在互联网上找不到这个)。 谢谢。

编辑 :我注意到numpy也有一个float16类型,可以节省更多的内存。 点之间的距离约为10000,有25个唯一点,我的答案需要是最接近的整数。 float16会提供精确度还是我需要使用float32?

作为第一步,您应该使用NumPy数组来存储数据而不是Python列表。

正如您所正确观察到的,Python float在内部使用双精度,而Python float的双精度可以用8个字节表示。 但是在64位机器上,使用Python的CPython参考实现,Python float 对象需要一个完整的24字节内存:底层双精度值为8个字节,对象类型指针为8个字节,8引用计数的字节数(用于垃圾收集)。 Python中没有Java的“原始”类型或.NET的“值”类型 - 一切都是盒装的。 这使得语言语义更简单,但意味着对象往往更胖。

现在,如果我们要创建一个float对象的Python 列表 ,那么列表本身会增加额外的开销:每个Python float一个8字节的对象指针(仍然假设这里有64位机器)。 因此,一般来说, n Python float对象的列表将花费你超过32n字节的内存。 在一台32位的机器上,事情好一点,但并不多:我们的float对象每个占用16个字节,而对于列表指针,我们将使用20n字节的内存作为一个长度为float的列表n (警告:如果您的列表从多个列表索引引用相同的 Python float对象,则此分析不太有用,但这不是特别常见的情况。)

相比之下, n双精度浮点数的NumPy数组(使用NumPy的float64 dtype)将其数据以“打包”格式存储在一个8n字节的单个数据块中,因此允许数组元数据的总内存需求将略高于8n字节。

结论:只需从Python列表切换到NumPy数组,就可以将内存需求减少大约4倍。如果仍然不够,那么考虑将精度从双精度降低到单精度可能是有意义的(NumPy的float32 dtype),如果这符合您的准确性需求。 NumPy的float16数据类型每个浮点只占2个字节,但只记录大约3个十进制数字的精度; 我怀疑它对你描述的应用程序来说几乎没用。

您可以尝试ctypes标准库中的c_float类型。 或者,如果您能够安装其他软件包,则可以尝试使用numpy软件包。 它包括float32类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM