Python float precision float

时间:2015-04-23 14:30:23

标签: python floating-point double precision

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

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

2 个答案:

答案 0 :(得分:10)

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

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

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

相反,NumPy float双精度浮点数阵列(使用NumPy' s n dtype)将其数据存储在" packed"格式在float64个字节的单个数据块中,因此允许数组元数据的总内存需求将略高于8n个字节。

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

答案 1 :(得分:2)

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