34

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

2 回答 2

47

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

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

于 2018-01-07T15:41:44.423 回答
5

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?为什么这个限制列表、字符串、字典大小?

  • 没有办法用比这更大的元素来索引一个列表。该列表不能比这更大,因为它不会接受 non Py_ssize_t
  • 在字典的情况下,Py_ssize_t用作散列。Python 在其字典实现中不使用链表,它使用开放寻址/探测,如果发现冲突,我们会以系统的方式获取另一个位置来查找键并放置值。Py_ssize_t因此,您只能在 Python 中的字典中拥有更多内容。

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

于 2021-04-02T08:34:08.533 回答