我在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
运算符)
答案 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()
。