Answers:
根据源代码,列表的最大大小为PY_SSIZE_T_MAX/sizeof(PyObject*)
。
PY_SSIZE_T_MAX
在pyport.h中定义为((size_t) -1)>>1
在常规的32位系统上,这是(4294967295/2)/ 4或536870912。
因此,在32位系统上,python列表的最大大小为536,870,912个元素。
只要您拥有的元素数量等于或小于此数量,所有列表函数都应正确运行。
PyObject *
。那东西就是所谓的指针(由于末尾有星号,您可以识别它们)。指针的长度为4个字节,并将内存地址存储到分配的对象中。它们“只有” 4个字节长,因为使用4个字节,您可以寻址当今计算机内存中的每个元素。
PY_SSIZE_T_MAX
可以非常大。
sys.maxsize
平台的Py_ssize_t类型支持的最大正整数,因此列表,字符串,字典和许多其他容器可以具有的最大大小。
在我的计算机(Linux x86_64)中:
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
是问题的答案。不同的体系结构支持不同的最大值。
当然可以。实际上,您可以轻松地自己看到:
l = range(12000)
l = sorted(l, reverse=True)
在我的机器上运行这些行需要:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
但是可以肯定,正如其他人所说。数组越大,操作将越慢。
Python列表实际上是作为用于快速随机访问的向量实现的,因此容器基本上将容纳与内存中的空间一样多的项目。(您需要用于列表中包含的指针的空间以及在内存中用于指向的对象的空间。)
追加是O(1)
(摊销的恒定复杂度),但是,插入/从序列中间删除将需要O(n)
(线性复杂度)重新排序,这将随着列表中元素数量的增加而变慢。
您的排序问题更加细微,因为比较操作可能会花费无数的时间。如果您执行的比较缓慢,则需要花费很长时间,尽管这不是Python的list数据类型的错。
反转只需要交换列表中所有指针所需的时间O(n)
(由于触摸每个指针一次,所以有必要(线性复杂度))。
列表号没有限制。导致错误的主要原因是RAM。请升级您的内存大小。
sizeof(PyObject*) == 4?
呢?这代表什么?