在 Python 中,什么是 `sys.maxsize`?

In Python, what is `sys.maxsize`?

我假设这个数字 (2^63 - 1) 是 python 可以处理或存储为变量的最大值。但这些命令似乎工作正常:

>>> sys.maxsize
9223372036854775807
>>> a=sys.maxsize + 1
>>> a 
9223372036854775808

所以有什么意义吗?如果计算资源允许,Python 可以处理任意大的数字吗?

注意,这是我的版本的打印输出:

>>> sys.version
3.5.2 |Anaconda custom (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]'

Python 可以在计算中处理任意大的整数。任何太大而不适合 64 位(或任何底层硬件限制)的整数都在软件中处理。因此,Python 3 没有 sys.maxint 常量。

另一方面,值 sys.maxsize 报告平台的指针大小,这限制了 Python 的数据结构(例如字符串和列表)的大小。

sys.maxsize 的文档:

An integer giving the maximum value a variable of type Py_ssize_t can take. It’s usually 2**31 - 1 on a 32-bit platform and 2**63 - 1 on a 64-bit platform. python3

The largest positive integer supported by the platform’s Py_ssize_t type, and thus the maximum size lists, strings, dicts, and many other containers can have. python2

什么是 Py_ssize_t

它是一种索引类型(用于索引事物的数字类型,如列表)。它是size_t(来自C语言)的签名版本。

  • 我们不使用普通数字/整数,因为这在 Python 中是无界的。
  • 在Python中,我们不使用size_t,因为我们要支持负索引,在Python中,我们可以使用my_list[-4:]。因此 Py_ssize_t 提供范围内的负数和正数。
  • 中的_t代表类型,告诉开发者size_t是类型名,不是变量。 Just a convention.

那么限制 Py_ssize_t 有什么影响呢?为什么这个限制列表、字符串、字典大小?

  • 无法为包含大于此元素的列表编制索引。该列表不能比这更大,因为它不接受非 Py_ssize_t.
  • 在字典情况下,Py_ssize_t 用作散列。 Python 在其字典实现中不使用链表,它使用开放式寻址/探测,如果发现冲突,我们将采用系统的方法获取另一个位置来查找键并放置值。所以在 Python.
  • 中的字典中不能超过 Py_ssize_t

在所有实际情况下(64 位机器,也可能是你),在你达到最大 Py_ssize_t 之前,你会 运行 内存不足。尝试 dict.fromkeys(range(sys.maxsize + 5)) 从来没有成功,它只是减慢了我的电脑速度。