在Python中,什么是"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 的文档:

一个整数,给出 Py_ssize_t 类型的变量可以取的最大值。在 32 位平台上通常是 2**31 - 1,在 64 位平台上通常是 2**63 - 1。蟒蛇3

平台的Py_ssize_t类型支持的最大正整数,因此列表、字符串、字典和许多其他容器可以具有的最大大小。 蟒蛇2

什么是Py_ssize_t

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

  • 我们不使用普通的数字/整数,因为这在 Python 中是无限的。
  • 在 Python 中,
  • 我们不使用size_t,因为我们想支持负索引,在 Python 中我们可以做my_list[-4:].因此,Py_ssize_t在一个范围之间提供负数和正数。
  • _t代表类型,用于通知开发人员size_t是类型名称,而不是变量。只是一个惯例。

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

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

在所有实际情况下(64 位机器,又名您可能),在最大Py_ssize_t之前,您将耗尽内存。尝试dict.fromkeys(range(sys.maxsize + 5))从未到达那里,它只是减慢了我的计算机速度。

最新更新