Python列表可以有多大?


119

在Python中,列表可以有多大?我需要大约12000个元素的列表。我仍然可以运行列表方法(例如排序等)吗?

Answers:


193

根据源代码,列表的最大大小为PY_SSIZE_T_MAX/sizeof(PyObject*)

PY_SSIZE_T_MAXpyport.h中定义为((size_t) -1)>>1

在常规的32位系统上,这是(4294967295/2)/ 4或536870912。

因此,在32位系统上,python列表的最大大小为536,870,912个元素。

只要您拥有的元素数量等于或小于此数量,所有列表函数都应正确运行。


4
为什么sizeof(PyObject*) == 4?呢?这代表什么?
马特2015年

4
@Matt是单个的字节数PyObject *。那东西就是所谓的指针(由于末尾有星号,您可以识别它们)。指针的长度为4个字节,并将内存地址存储到分配的对象中。它们“只有” 4个字节长,因为使用4个字节,您可以寻址当今计算机内存中的每个元素。
Antonio Ragagnin

1
值得注意的是(如ÁlvaroJusten的回答所示),在其他计算机上,尤其是在运行64位系统的计算机上,的价值PY_SSIZE_T_MAX可以非常大。
ClydeTheGhost

@ClydeTheGhost,您能否指定运行64位系统的那些程序的最大大小是否也可以小于536,870,912个元素?还是它们可以相差很大,却始终具有等于或大于536,870,912个元素的最大大小?

1
@at 64位系统的最大值始终等于或大于32位系统的最大值。
ClydeTheGhost

71

Python文档所述

sys.maxsize

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

在我的计算机(Linux x86_64)中:

>>> import sys
>>> print sys.maxsize
9223372036854775807

这如何回答问题
ldgorman

11
@ldgorman,sys.maxsize是问题的答案。不同的体系结构支持不同的最大值。
Simon Kuang

2
9223372036854775807元素?真?与最不赞成的答案也有很大不同。
akki 2016年

13
@akki可接受的答案是指32位系统。既然是2016年,我将假设您使用的是64位系统,因此答案是正确的
Brian Leach

2
应该选择答案。
Lokesh

26

当然可以。实际上,您可以轻松地自己看到:

l = range(12000)
l = sorted(l, reverse=True)

在我的机器上运行这些行需要:

real    0m0.036s
user    0m0.024s
sys  0m0.004s

但是可以肯定,正如其他人所说。数组越大,操作将越慢。


20
这种方式的计时可能会误导人-大多数时间都花在启动Python解释器上。更好的方法是:python -m timeit.py“ l = range(12000); l = sorted(l,reverse = True)”。在我的机器上,这个例子的时间大约是1/20。
dF。

5
@dF,您对准确性是正确的。感谢您的注意。我只是想证明一点。实例证明了这一点。
Nadia Alramli,2009年

13
@dF:太棒了!0.024秒对我来说太长了,我很高兴现在可以不再为此担心。
Thomas Edleson

6

在临时代码中,我创建了包含数百万个元素的列表。我相信Python的列表实现仅受系统上内存量的限制。

此外,尽管列表很大,但列表方法/函数仍应继续工作。

如果您关心性能,那么值得研究一下NumPy之类的库。


5

清单的性能特征在Effbot 进行了描述。

Python列表实际上是作为用于快速随机访问的向量实现的,因此容器基本上将容纳与内存中的空间一样多的项目。(您需要用于列表中包含的指针的空间以及在内存中用于指向的对象的空间。)

追加是O(1)(摊销的恒定复杂度),但是,插入/从序列中间删除将需要O(n)(线性复杂度)重新排序,这将随着列表中元素数量的增加而变慢。

您的排序问题更加细微,因为比较操作可能会花费无数的时间。如果您执行的比较缓慢,则需要花费很长时间,尽管这不是Python的list数据类型的错。

反转只需要交换列表中所有指针所需的时间O(n)(由于触摸每个指针一次,所以有必要(线性复杂度))。


4

12000个元素在Python中什么都没有...实际上,只要Python解释器在您的系统上具有内存,元素的数量就可以增加。


3

对于不同的系统,它会有所不同(取决于RAM)。最简单的找出方法是

import six six.MAXSIZE 9223372036854775807 这使的最大尺寸listdict太,按照该文件


1
那不是文档
Boris

1

我想说,您仅受可用RAM总量的限制。显然,数组越大,对其进行的操作就越长。


4
通常是正确的,但并非全部都正确-附加保持摊销的固定时间与数组的大小无关。
2009年

0

我是在x64位系统上从这里获得的:win32上的Python 3.7.0b5(v3.7.0b5:abb8802389,2018年5月31日,01:54:01)[MSC v.1913 64位(AMD64)]

在此处输入图片说明


1
如果您扩展了一些细节以及其他人如何找到自己的极限,这将是一个很好的答案。
Shayaan

-16

列表号没有限制。导致错误的主要原因是RAM。请升级您的内存大小。


9
-1是因为它实际上并未回答问题,并且实际上具有误导性,因为(确实如其他答案所示)列表确实具有最大大小。
ClydeTheGhost
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.