Python列表有多大?

Dev*_*ted 108 python size list

在Python中,列表有多大?我需要一个大约12000个元素的列表.我还能运行排序等列表方法吗?

Unk*_*own 178

根据源代码,列表的最大大小是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个元素.

只要您拥有的元素数量等于或低于此数量,所有列表函数都应该正常运行.

  • 为什么`sizeof(PyObject*)== 4?`?这代表什么? (4认同)
  • @Matt,是单个`PyObject*`的字节数.那个东西是一个所谓的指针(你可以识别它们,因为最后是星号).指针长度为4个字节,并将内存地址存储到分配的对象中.它们"仅"4个字节长,因为4个字节可以解决当今计算机内存中的每个元素. (4认同)

Álv*_*ten 58

正如Python文档所说:

了sys.maxsize

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

在我的电脑(Linux x86_64)中:

>>> import sys
>>> print sys.maxsize
9223372036854775807
Run Code Online (Sandbox Code Playgroud)

  • @akki接受的答案是指32位系统.从2016年开始,我将假设您使用的是64位系统,因此答案是正确的 (11认同)
  • @ ldgorman,`sys.maxsize`就是这个问题的答案.不同的架构支持不同的最大值. (10认同)
  • 9223372036854775807元素?真?这也与最受欢迎的答案有很大不同. (2认同)
  • 应该选择答案。 (2认同)
  • Sys.maxsize 在 32 位平台上应为 2^31 - 1,在 64 位平台上应为 2^63 - 1。(分别为 2147483647 或 9223372036854775807)但是,由于 32 位列表上的每个指针占用 4 个字节,而在 64 位上则为 8 个字节,因此如果您尝试在64 位系统或 32 位系统上的 maxsize/4。 (2认同)

Nad*_*mli 27

当然可以.实际上你可以轻松地看到自己:

l = range(12000)
l = sorted(l, reverse=True)
Run Code Online (Sandbox Code Playgroud)

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

real    0m0.036s
user    0m0.024s
sys  0m0.004s
Run Code Online (Sandbox Code Playgroud)

但确实如其他人所说的那样.数组越大,操作越慢.

  • 这种方式的时间安排可能会产生误导 - 大部分时间都花在启动Python解释器上.更好的方法是:python -m timeit.py"l = range(12000); l = sorted(l,reverse = True)".在我的机器上,这给了这个例子大约1/20的时间. (19认同)
  • @dF:太棒了!0.024s对我来说太长了,我很高兴我现在可以不再担心了. (12认同)
  • @dF,你对准确性是正确的.感谢您注意到.我只想证明一点.这个例子证明了这一点. (5认同)

Dou*_*oug 6

在随意的代码中,我创建了包含数百万个元素的列表.我相信Python的列表实现只受系统内存量的限制.

此外,尽管列表的大小,列表方法/功能仍应继续工作.

如果您关心性能,那么查看NumPy等库可能是值得的.


Alb*_*oPL 5

Python中有12000个元素......实际上,只要Python解释器在您的系统上有内存,元素的数量就可以了.


cdl*_*ary 5

列表的性能特征在Effbot上描述.

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

附加是O(1)(分摊的常量复杂度),但是,从序列中间插入/删除将需要O(n)(线性复杂性)重新排序,这将比列表中的元素数量慢.

您的排序问题更加细致,因为比较操作可能需要无限的时间.如果你进行非常慢的比较,那将花费很长时间,尽管它不是Python列表数据类型的错误.

逆转只需要交换列表中所有指针所需的时间(必然O(n)(线性复杂度),因为您只需触摸每个指针一次).


yun*_*nus 5

它因不同的系统而异(取决于 RAM)。最简单的找出方法是

import six six.MAXSIZE 9223372036854775807 根据文档, 这也给出了list和的最大大小dict

  • 这不是文档 (2认同)