整数和复杂对象的大小之间有什么关系?

时间:2015-03-12 08:46:11

标签: python memory sizeof complex-numbers

我最近听说过Python整数缓存。在互联网上搜索之后,我发现了这篇写得很好的文章:http://www.laurentluce.com/posts/python-integer-objects-implementation。它解释了我想知道的关于这个主题的内容。

在本文中,它解释了为什么整数对象不仅是16或32位宽,如在C中。实际上,Python需要存储对象标头(因为int Python整数是< / em>一个对象)和这个整数的值(long C类型,根据http://en.wikipedia.org/wiki/C_data_types至少32位)。

在我的机器上,我得到:

>>> x = 5
>>> type(x)
<type 'int'>
>>> sys.getsizeof(x)
12

确定。因此,Python int对象的宽度为12个字节。

我的问题来自整数和复杂大小之间的比较。我在同一台机器上打字:

>>> z = 5 + 5j
>>> type(z)
<type 'complex'>
>>> sys.getsizeof(z);
24

我相信complex是一个对象。因此,作为int,每个complex对象必须存储其对象标头。但是,如果int的标题加上其值等于12,为什么complex的标题(与int大小相同,我想!)加上其值(大小的2倍)整数?)等于24?

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

因为complex包含两个浮点数,而不是两个整数:

>>> import sys
>>> z = 5 + 5j
>>> z.imag
5.0
>>> z.real
5.0
>>> sys.getsizeof(z.imag)
16
>>> sys.getsizeof(z.real)
16
>>> sys.getsizeof(z)
24

您可以看到complexobject源代码in the Python repo

答案 1 :(得分:1)

因为复数被表示为一对浮点数:

  

imaginary literal产生一个复数,其实部为0.0。复数表示为一对浮点数,并且对其范围具有相同的限制。要使用非零实部创建复数,请向其添加浮点数,例如(3 + 4j)。想象文字的一些例子: