Fah*_*him 5 python 64-bit integer
从这个问题(How big can a 64bitsigned integer be?),我了解到在 64 位机器上可以使用的最大数字是2^64-1,即92,233,720,368,547,758,070。这意味着,即使我添加1它,它也应该返回inf. 但它没有显示inf。这是我观察到的:
>>> max = sys.maxsize
>>> format(max, ',')
'9,223,372,036,854,775,807'
>>> a = max * 10
>>> format(a, ',')
'92,233,720,368,547,758,070'
>>> a / max
10.0
Run Code Online (Sandbox Code Playgroud)
即使由于某种原因92,233,720,368,547,758,070不是Python的最大数字,那么 又有什么用呢sys.maxsize?
其次,64位的数字不应该占用64位的内存空间吗?为什么 和max都a服用36 bytes?
>>> sys.getsizeof(max)
36
>>> sys.getsizeof(a)
36
Run Code Online (Sandbox Code Playgroud)
谁能描述一下这两种混乱吗?
Python 3 (CPython) 整数不是本机机器整数。从逻辑上讲,每个整数由其符号和以 1073741824(30 位)或 32768(15 位)[*] 为基数的绝对数组成 - 后者是一个可变大小的无符号整数数组。为了存储更大的数字,需要在数组中添加一个额外的“数字”。
\n>>> sys.getsizeof(0) # largest 0-digit number\n24\n>>> sys.getsizeof(1) # smallest 1-digit number\n28\n>>> sys.getsizeof(2**30 - 1) # largest 1-digit number\n28\n>>> sys.getsizeof(2**30) # smallest 2-digit number\n32\n>>> sys.getsizeof(2**60 - 1) # largest 2-digit number\n32\nRun Code Online (Sandbox Code Playgroud)\n粗略地说,这与在写出十进制数 \xe2\x80\x93 时添加数字相同的机制,使用 1 位数字足以达到 9,2 位数字达到 99,依此类推。同样,只要计算机有内存“添加一个数字”,就可以定义更大尺寸的 Python 整数。
\n[*]数字是 30 位/15 位,而不是 32 位/16 位,因为这更适合某些算法。例如,long_pow()需要可被 5 整除的大小。
实际上,整数也是对象 \xe2\x80\x93 ,这意味着它们保存类型和引用计数等元数据 - 这也占用空间。在 CPython 中,anint包含:
Py_ssize_tPyTypeObject*Py_ssize_tdigit[]其中前三个是每个可变大小对象的结构。该符号被编码在数字计数内。
\n在 64 位机器上, 和Py_ssize_t的PyTypeObject*大小均为 8 字节 \xe2\x80\x93,从而使“0 位整数”的0大小为 3*8 字节或 24 字节。
>>> sys.getsizeof(0) # largest 0-digit number\n24\nRun Code Online (Sandbox Code Playgroud)\nsys.maxsize?的含义sys.maxsize不是最大整数大小,而是最大容器大小:
>>> len(range(sys.maxsize)) # this is fine\n9223372036854775807\n>>> len(range(sys.maxsize+1)) # this is one too much\nTraceback (most recent call last):\n File "<stdin>", line 1, in <module>\nOverflowError: range() result has too many items\nRun Code Online (Sandbox Code Playgroud)\nsys.maxsize这是表达 的最大值的直接结果Py_ssize_t,CPython 运行时使用该类型来表示和寻址内存。虽然这看起来像是一个任意的限制,但实际上它远远超出了计算机可以解决的范围。
| 归档时间: |
|
| 查看次数: |
4063 次 |
| 最近记录: |