整数大小和复数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:
我最近听说 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).
在我的机器上,我得到:
>>> 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: