整数大小和复数objects有什么关系?

What's the relationship between size of integer and complex objects?

我最近听说 Python 整数缓存。在互联网上搜索后,我找到了这篇 well-written 文章:http://www.laurentluce.com/posts/python-integer-objects-implementation。它解释了我想了解的关于这个主题的内容。

在这篇文章中,它解释了为什么整数 object 不仅像 C 中那样只有 16 位或 32 位宽。实际上,Python 需要存储 object header(因为 int Python 整数 一个 object)和这个整数的值(long C 类型, 所以根据 http://en.wikipedia.org/wiki/C_data_types).

至少有 32 位

在我的机器上,我得到:

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

好的。所以 Python int object 是 12 字节宽。

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

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

我认为 complex 是 object。因此,作为 int,每个 complex object 必须存储其 object header。但是,如果 int 的 header 加上它的值等于 12,为什么 complex 的 header (我想与 int 大小相同!)加上它的值(整数大小的两倍?)等于 24 ?

非常感谢!

因为 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

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

An imaginary literal yields a complex number with a real part of 0.0. Complex numbers are represented as a pair of floating point numbers and have the same restrictions on their range. To create a complex number with a nonzero real part, add a floating point number to it, e.g., (3+4j). Some examples of imaginary literals: