在Python中获取基本数据类型的大小

14

我在使用Python中的sys.getsizeof函数时感到非常困惑。我想确定对于一个浮点数值,系统使用的是4个字节还是8个字节(即C语言术语中的单精度或双精度)。

我按照以下步骤进行:

import sys

x = 0.0
sys.getsizeof(x)  # Returns 24

type(x) # returns float

sys.getsizeof(float)  # Returns 400.

如何简单地找出浮点表示实际使用了多少字节。我知道应该是8个字节,但怎么验证呢(类似于C ++中的sizeof运算符)


2
只是好奇:你为什么对这个感兴趣? - user9455968
你期望 sys.getsizeof(float) 返回什么?为什么要检查实际类的大小? - Chris_Rands
@Chris_Rands 是的,那就是我想找出来的。我怎样才能检查底层表示的大小? - Luca
@LutzHorn 正在将一些代码从 C 语言转换,想知道差异是否是由于精度问题引起的。同时,也想知道如何进行比较。 - Luca
1
从文档中了解到,几乎所有的计算机(截至2000年11月)都使用IEEE-754浮点运算,而几乎所有平台都将Python浮点数映射为IEEE-754“双精度”。因此可以确定它是双精度。@Luca - Morten Jensen
3个回答

13

跑步

sys.getsizeof(float)

它不返回任何单个浮点数的大小,而是返回float 的大小。该类包含比任何单个浮点数更多的数据,因此返回的大小也会大得多。

如果您只想知道单个浮点数的大小,最简单的方法是实例化任意浮点数。例如:

sys.getsizeof(float())

请注意

float()

简单地返回 0.0,因此这实际上等同于:

sys.getsizeof(0.0)

这在你的情况下返回 24 字节(对于大多数人来说可能也是如此)。在CPython(最常见的Python实现)中,每个float对象都将包含一个引用计数器和一个指向类型的指针(指向float类的指针),对于64位的CPython每个都是8字节,对于32位的CPython每个是4字节。剩余的字节(在你的情况下为 24-8-8 = 8,很可能是64位的CPython)将用于实际的浮点值本身。

但是不能保证对其他Python实现方式会有同样的结果。 语言参考 指出:

它们表示机器级双精度浮点数。您受制于底层机器架构(以及C或Java实现)对溢出的接受范围和处理。Python不支持单精度浮点数;通常使用这些数字的处理器和内存使用的节省比在Python中使用对象的开销更小,因此没有理由为语言增加两种浮点数。

我不知道是否存在运行时方法可以准确地告诉您所使用的字节数。但是请注意,语言参考中上面的引用确实说Python仅支持双精度浮点数,因此在大多数情况下(取决于对您始终100%正确的要求有多重要)它应该与C中的双精度相当。


如果你看一下我的问题,我尝试了这个并且它返回了24...这似乎是错误的。我期望得到8个字节或64位。 - Luca

8
import ctypes
ctypes.sizeof(ctypes.c_double)

2

根据文档

getsizeof() 调用对象的 sizeof 方法,并在对象由垃圾收集器管理时添加额外的垃圾收集器开销。

sys.getsizeof 与 C 中的字节大小不同。

对于 int,可以使用 bit_length() 方法。


1
是的,我现在看到了,但是找出浮点值大小的Python方法是什么? - Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接