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

Chr*_*ull 7 python max-size

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

>>> sys.maxsize 9223372036854775807

>>> a sys.maxsize + 1
>>> a 
9223372036854775808
Run Code Online (Sandbox Code Playgroud)

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

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

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

Boa*_*les 17

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

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

  • 谢谢!平台的指针大小到底是多少? (2认同)
  • 它是地址寄存器的宽度:处理器可以物理引用的不同内存位置的数量。 (2认同)

Ben*_*rth 8

sys.maxsize 的文档:

\n
\n

一个整数,给出 Py_ssize_t 类型的变量可以采用的最大值。它\xe2\x80\x99在32位平台上通常为2**31 - 1,在64位平台上通常为2**63 - 1。蟒蛇3

\n
\n
\n

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

\n
\n

什么是Py_ssize_t?

\n

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

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

那么限制了会有什么影响呢Py_ssize_t?为什么要限制列表、字符串、字典的大小?

\n
    \n
  • 无法对元素大于此的列表进行索引。该列表不能比这个更大,因为它不接受非Py_ssize_t.
  • \n
  • 在字典情况下,Py_ssize_t用作哈希。Python 在其字典实现中不使用链表,它使用开放寻址/探测,如果发现冲突,我们会以系统的方式找到另一个位置来查找键并放置值。所以在 Python 中你不能拥有比Py_ssize_t字典更多的内容。
  • \n
\n

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

\n