首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python浮点精度浮点

问Python浮点精度浮点
EN

Stack Overflow用户
提问于 2015-04-23 14:30:23
回答 2查看 4.4K关注 0票数 6

我需要实现一个动态规划算法,以解决旅行推销员问题的时间,比布鲁特力搜索计算之间的距离。为此,我需要按大小对子问题进行索引,每个子问题的值将是一个浮动(巡演的长度)。但是,如果我使用python浮点数(实际上具有双精度),将数组保存在内存中将需要大约6GB的RAM,因此要尝试将该数量减半(我只有4GB RAM),我将需要使用单精度浮点数。但是,我不知道如何在Python中获得单个精确浮动(我正在使用Python 3)。谁能告诉我在哪里能找到他们(我在网上找不到多少)。谢谢。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 15:57:48

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

正如您正确地观察到的,Python在内部使用双精度,而Python浮点数的双精度值可以用8个字节表示。但是在64位计算机上,使用CPython的float引用实现,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的列表。(请注意:如果列表引用来自多个列表索引的同一个Python对象,则这种分析不太有效,但这不是一个特别常见的情况。)

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

结论:只要从Python切换到NumPy数组,您的内存需求就会减少大约4倍。如果这还不够,那么考虑将精度从双精度降低到单一精度(NumPy的float32 dtype)可能是有意义的,如果这与您的精度需求一致的话。NumPy的float16数据类型每个浮动只需要2个字节,但是只记录了大约3位小数位的精度;我怀疑它对您描述的应用程序几乎毫无用处。

票数 12
EN

Stack Overflow用户

发布于 2015-04-23 14:33:28

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29826523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档