在 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))
从来没有成功,它只是减慢了我的电脑速度。
我假设这个数字 (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))
从来没有成功,它只是减慢了我的电脑速度。