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

时间:2018-01-07 15:27:54

标签: python max-size

我假设这个数字(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)]'

2 个答案:

答案 0 :(得分:8)

Python可以在计算中处理任意大的整数。在软件中处理任何大于64位(或任何基础硬件限制)的整数。因此,Python 3没有sys.maxint常量。

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

答案 1 :(得分:3)

sys.maxsize 的文档:

<块引用>

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

<块引用>

平台的 Py_ssize_t 类型支持的最大正整数,因此列表、字符串、字典和许多其他容器可以拥有的最大大小。 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)) 没有成功,它只是降低了我的计算机速度。