Python浮点精度浮点

Python浮点精度浮点,python,floating-point,double,precision,Python,Floating Point,Double,Precision,我需要实现一个动态规划算法来及时解决旅行商问题,这比计算点之间距离的蛮力搜索要好。为此,我需要按大小对子问题进行索引,每个子问题的值将是一个浮点值(巡更的长度)。然而,如果我使用python浮点(实际上具有双精度),那么在内存中保存数组将需要大约6gbram,因此为了尝试将该数量减半(我只有4gbram),我将需要使用单精度浮点。但是,我不知道如何在Python中获得单精度浮点(我使用的是Python 3)。有人能告诉我在哪里可以找到它们吗(我在网上找不到太多)。谢谢 编辑:我注意到numpy还

我需要实现一个动态规划算法来及时解决旅行商问题,这比计算点之间距离的蛮力搜索要好。为此,我需要按大小对子问题进行索引,每个子问题的值将是一个浮点值(巡更的长度)。然而,如果我使用python浮点(实际上具有双精度),那么在内存中保存数组将需要大约6gbram,因此为了尝试将该数量减半(我只有4gbram),我将需要使用单精度浮点。但是,我不知道如何在Python中获得单精度浮点(我使用的是Python 3)。有人能告诉我在哪里可以找到它们吗(我在网上找不到太多)。谢谢


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

您可以从
ctypes
标准库中尝试
c\u float
类型。或者,如果您能够安装其他软件包,您可以尝试
numpy
软件包。它包括
float32
类型。

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

正如您正确观察到的,Python浮点在内部使用双精度,Python浮点的双精度值可以用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
字节的内存来创建长度
n
float
s列表。(注意:如果列表引用来自多个列表索引的同一Python
float
对象,则此分析不太有效,但这种情况并不常见。)

相比之下,由
n
双精度浮点组成的NumPy数组(使用NumPy的
float64
dtype)将其数据以“压缩”格式存储在
8n
字节的单个数据块中,因此考虑到数组元数据,总内存需求将略高于
8n
字节


结论:只要从Python列表切换到NumPy数组,您的内存需求就会减少大约4倍。如果这还不够,那么考虑从双精度到单精度降低精度可能是有意义的(NumPy的<代码> FLUAT32 dType),如果这符合您的精度需求。NumPy的
float16
datatype每个float只需要2个字节,但只记录大约3位小数精度;我怀疑它对于您描述的应用程序几乎毫无用处。

我已经安装了numpy(它随我安装的python发行版一起提供),但从未使用过它。嗯,我想一切都是第一次!使用
c_float
弊大于利:一个
c_float
对象比一个普通的Python
float
要大得多。谢谢你提供的信息。“我的建议应该被交换,因为不管怎样,numpy将是我的第一选择。”@MarkDickinson。谢谢,这帮助我的内存使用率下降到略高于1GB,这意味着我的解决方案至少在空间方面是可行的。我在掌握numpy数组时遇到了一些麻烦,因为它的语法不同于python列表,但我学得很快!是的,肯定有一个学习曲线。然而,对于大数据,结果往往是值得的。