python如何存储超出范围的整数?

Shu*_*wal 6 python memory memory-management

我们有一个 python 列表。当它为空时,它的大小为 28。

\n
import sys\na= []\nprint(sys.getsizeof(a))\n
Run Code Online (Sandbox Code Playgroud)\n

输出:28

\n

当我在列表中添加一个整数元素时:

\n
import sys\na= [1]\nprint(sys.getsizeof(a))\nprint(type(a[0]))\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
32\n<class \'int\'>\n
Run Code Online (Sandbox Code Playgroud)\n

因此,对于我添加的每个整数,列表会为每个整数动态分配 4 个字节。

\n

这样,列表中整数元素的最大大小应为 2 31 -1,即 2147483647。

\n

但是当我使用以下代码时:

\n
import sys\na= [1,2,5,5000000000000000000000000000000000000000000000000000000000000]\n\nprint(sys.getsizeof(a))\nprint(type(a[-1]))\n
Run Code Online (Sandbox Code Playgroud)\n

输出是:

\n
44\n<class \'int\'>\n[Finished in 0.2s\n
Run Code Online (Sandbox Code Playgroud)\n

这个数字是 5 \xc3\x97 10 29,远远超出了限制。\n在二进制中,数字是:\n 1100011100100010111100001110111110011101100000001010101011010110010000100100110100111010110100101011011110111001011111101111010100001111010101000000000000000000000000000000000000000000000000000000000000\n长度为 202 个字符,这意味着它需要 202 位。\nPython 仍然使用4个字节没有任何损失。

\n

这是如何运作的?引擎盖下是否存在某种压缩?我已经通过官方文档搜索了这一点,但仍然不明白这是如何发生的。

\n

我发现了什么:

\n\n

另外,这个问题的最初灵感是:\n https://youtu.be/gDqQf4Ekr2A?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12&t=123 \n任何帮助/解释表示赞赏。谢谢。

\n

Sła*_*art 0

这是一个很好的问题。

这是一个易于运行的观察它是如何工作的

只需在 python shell 中运行此代码,并观察 python 进程的内存使用情况(在 top/htop 等中)。几分钟后,您应该会看到此代码如何消耗 MB。

gogol = 10**100
gogoplex = 10**gogol
Run Code Online (Sandbox Code Playgroud)

...直到达到您的 RAM 限制。python 中 bignum 的唯一限制,用于表示整数。