在python中获取原始数据类型的大小

时间:2018-03-16 10:44:41

标签: python

我在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运算符)

3 个答案:

答案 0 :(得分:8)

运行

sys.getsizeof(float)

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

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

sys.getsizeof(float())

请注意

float()

只返回0.0,所以这实际上相当于:

sys.getsizeof(0.0)

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

但不保证这对其他Python实现的方式不同。 language reference说:

  

这些表示机器级双精度浮点数。您可以接受底层机器架构(以及C或Java实现),以获得可接受的范围和溢出处理。 Python不支持单精度浮点数;处理器和内存使用的节省通常是使用它们的原因,这与使用Python中的对象的开销相形见绌,因此没有理由使用两种浮点数使语言复杂化。

我并不知道任何运行时方法可以准确地告诉你使用的字节数。但请注意,语言参考上面的引用确实说Python只支持双精度浮点数,所以在大多数情况下(取决于你总是100%正确的重要程度),它应该与C中的双精度相当。

答案 1 :(得分:3)

import ctypes
ctypes.sizeof(ctypes.c_double)

答案 2 :(得分:2)

来自the docs

  

getsizeof()调用对象的 sizeof 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

sys.getsizeof与C中的字节大小无关。

对于int,有bit_length()