Had*_*han 5 python floating-point precision double
我需要实现一个动态编程算法来及时解决旅行商问题,这比Brute Force Search计算点之间的距离要好.为此,我需要按大小索引子问题,每个子问题的值将是一个浮点数(游览的长度).然而,如果我使用python浮点数(实际上具有双精度),将数组保存在内存中将需要大约6GB的RAM,因此尝试将该数量减半(我只有4GB RAM)我将需要使用单精度浮点数.但是我不知道如何在Python中获得单精度浮点数(我使用的是Python 3).有人可以告诉我在哪里可以找到它们(我在互联网上找不到这个).谢谢.
编辑:我注意到numpy也有一个float16类型,可以节省更多的内存.点之间的距离约为10000,有25个唯一点,我的答案需要是最接近的整数.float16会提供精确度还是我需要使用float32?
Mar*_*son 10
作为第一步,您应该使用NumPy数组来存储数据而不是Python列表.
正如您所正确观察到的,Python float在内部使用双精度,而Python float的双精度值可以用8个字节表示.但是在64位机器上,使用Python的CPython参考实现,Python float 对象需要一个完整的24字节内存:底层双精度值为8个字节,对象类型指针为8个字节,8个字节用于引用计数(用于垃圾收集).Python中没有Java的"原始"类型或.NET的"值"类型 - 一切都是盒装的.这使得语言语义更简单,但意味着对象往往更胖.
现在,如果我们要创建一个Python 列表的float对象,还有列表本身的额外开销:每一个Python的8个字节的对象指针float(仍然假设一个64位的机器在这里).因此,一般来说,nPython float对象列表将花费你超过32n内存的字节数.在一台32位的机器上,事情好一点,但并不多:我们的float对象每个将占用16个字节,而对于列表指针,我们将使用20n内存字节来获取float长度为s的列表n.(警告:如果您的列表引用多个列表索引中的相同 Python float对象,则此分析不太有用,但这不是特别常见的情况.)
相比之下,NumPy n双精度浮点数组(使用NumPy的float64dtype)将其数据以"打包"格式存储在单个数据块中8n,因此允许数组元数据的总内存需求将略高于8n字节.
结论:只需从Python列表切换到NumPy数组,就可以将内存需求减少大约4倍.如果仍然不够,那么考虑将精度从双精度降低到单精度可能是有意义的(NumPy的float32dtype ),如果这符合您的准确性需求.NumPy的float16数据类型每个浮点只需要2个字节,但只记录大约3个十进制数字的精度; 我怀疑它对你描述的应用程序来说几乎没用.