python教程—为什么2 a的大小¶& # 179;36字节,但2¶& # 179;1只有24字节?-Python实用宝典

python教程—为什么2 a的大小¶& # 179;36字节,但2¶& # 179;1只有24字节?

Python中的所有东西都是一个对象。所以Python中int的大小会比通常要大。好吧,但是为什么需要12字节2¶相比³太2¶³- 1,而不是只有一个吗?

Python中的所有东西都是一个对象。所以Python中int的大小会比通常要大。

    >>> sys.getsizeof(int()) 24

OK, but why does it take 12 more bytes for 2⁶³ compared too 2⁶³ - 1 and not just one?

    >>> sys.getsizeof(2**63) 36 >>> sys.getsizeof(2**62) 24

I get that 2⁶³ is a long and 2⁶³-1 an int, but why 12 bytes of difference?

没有更多的直觉,我尝试了一些其他的东西:

    >>> a = 2**63 >>> a -= 2**62 >>> sys.getsizeof(a) 36

a仍然存储为long,即使它现在是int型的。这并不奇怪。但是:

    >>> a -= (2**63 - 1) >>> a = 2**63 >>> a -= (2**63 - 1) >>> a 1L >>> sys.getsizeof(a) 28

一个新的规模。

    >>> a = 2**63 >>> a -= 2**63 >>> a 0L >>> sys.getsizeof(a) 24

回到24字节,但仍然有一个长。

最后一件事:

    >>> sys.getsizeof(long()) 24

<强>问题:< /强>

在这些场景中,内存存储是如何工作的?

<强>潜在:< /强>

为什么要用12个字节来加上我们直觉告诉我们的只有1位?

Why are int() and long() 24 bytes, but long(1) is already 28 bytes and int(2⁶²)?

< em >注:Python 3。X的工作方式有点不同,但不是更直观。这里我关注的是Python 2.7;我没有测试以前的版本。

回答

why does it get 12 more bytes for 2⁶³ compared too 2⁶³ - 1 and not just one?

在< a href = " https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbcpx01/datatypesize64.htm " rel = " nofollow noreferrer " > LP64 < / >系统<一口> 1 < / >一同晚餐,Python 2 int < a href = " https://github.com/python/cpython/blob/aa2adc828a0583ee472d42a3b6a8964c822c7ee2/Include/intobject.h # L23”rel = " nofollow noreferrer " > < / >完全包含三个pointer-sized片段:

  • 类型的指针
  • 引用计数
  • 实际值,一个C长int

总共是24个字节。另一方面,一个Python long 组成:

  • 类型的指针
  • 引用计数
  • 数字计数,指针大小的整数
  • 内联值数字数组,每个持有30位的值,但存储在32位的单位(其中一个未使用的部分被用于< a href = " https://github.com/python/cpython/blob/dd431b32f4a599fff9c9cddfe9d48cc66b347481/Objects/longobject.c # L2995”rel = " nofollow noreferrer " >有效携带/借< / >在加法和减法)

2**63需要64位存储,所以它可以容纳三个30位的数字。由于每个数字都是4字节宽,所以整个Python的长度将需要24+3*4 = 36字节。

换句话说,区别在于长时间以来必须单独存储数字的大小(8个额外字节),以及存储值的空间效率稍低(12个字节存储2**63的数字)。包括大小,值2**63 in a long占用20字节。与所占用的8字节相比,简单int的任何值都会产生所观察到的12字节差异。

值得注意的是,python3只有一个整数类型,称为int,它是可变宽度的,并且以与python2 long相同的方式实现。

<人力资源>
<一口> 1 < /一口>
64位Windows的不同之处在于,它保留了一个32位的长int,这可能是为了与大量使用char、short和long作为8、16和32位值的“方便”别名的旧代码兼容。要在x86-64 Windows上获得实际的64位类型,必须使用_int64或(在较新的编译器版本上)long long或int64_t。由于python2在内部依赖于Python int在不同的地方适合于C long,所以sys。即使在64位Windows上,maxint仍然是2**31-1。Python 3也修复了这个怪癖,它没有maxint的概念。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论