[python] 파이썬 목록은 얼마나 커질 수 있습니까?

Python에서 목록은 얼마나 커질 수 있습니까? 약 12000 개의 요소 목록이 필요합니다. 정렬 등과 ​​같은 목록 메서드를 계속 실행할 수 있습니까?



답변

소스 코드 에 따르면 목록의 최대 크기는 PY_SSIZE_T_MAX/sizeof(PyObject*)입니다.

PY_SSIZE_T_MAXpyport.h 에 정의되어 있습니다.((size_t) -1)>>1

일반 32 비트 시스템에서는 (4294967295/2) / 4 또는 536870912입니다.

따라서 32 비트 시스템에서 파이썬 목록의 최대 크기는 536,870,912 요소입니다.

보유한 요소의 수가 이보다 작거나 같으면 모든 목록 기능이 올바르게 작동해야합니다.


답변

현상태대로 파이썬 문서 말한다 :

sys.maxsize

플랫폼의 Py_ssize_t 유형에서 지원하는 가장 큰 양의 정수, 따라서 최대 크기 목록, 문자열, dict 및 기타 많은 컨테이너가 가질 수 있습니다.

내 컴퓨터 (Linux x86_64) :

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


답변

물론 괜찮습니다. 실제로 쉽게 볼 수 있습니다.

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

내 컴퓨터에서 해당 라인을 실행하는 데는 다음이 소요되었습니다.

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

그러나 다른 사람들이 말했듯이 확실합니다. 어레이가 클수록 작업 속도가 느려집니다.


답변

캐주얼 코드에서는 수백만 개의 요소가 포함 된 목록을 만들었습니다. 파이썬의 목록 구현은 시스템의 메모리 양에 의해서만 제한된다고 생각합니다.

또한 목록의 크기에도 불구하고 목록 메서드 / 기능은 계속 작동해야합니다.

성능에 관심이 있다면 NumPy 와 같은 라이브러리를 살펴 보는 것이 좋습니다 .


답변

목록의 성능 특성 Effbot에 설명되어 있습니다.

Python 목록은 실제로 빠른 임의 액세스를위한 벡터로 구현되므로 컨테이너는 기본적으로 메모리에있는 공간만큼 많은 항목을 보유합니다. (목록에 포함 된 포인터를위한 공간과 가리키는 개체를위한 메모리 공간이 필요합니다.)

추가는 O(1)(상각 된 상수 복잡도)이지만, 시퀀스 중간에서 삽입 / 삭제하려면 O(n)(선형 복잡도) 재정렬 이 필요하며 목록의 요소 수만큼 느려집니다.

비교 작업에 무제한의 시간이 소요될 수 있으므로 정렬 질문이 더 미묘합니다. 정말 느린 비교를 수행하는 경우 Python의 목록 데이터 유형의 결함은 아니지만 시간이 오래 걸립니다 .

반전은 목록의 모든 포인터를 교체하는 데 필요한 시간 만 걸립니다 ( O(n)각 포인터를 한 번 터치하기 때문에 필요 (선형 복잡도)).


답변

12000 개의 요소는 파이썬에서 아무것도 아닙니다 … 그리고 실제로 파이썬 인터프리터가 시스템에 메모리를 가지고있는 한 요소의 수는 갈 수 있습니다.


답변

시스템마다 다릅니다 (RAM에 따라 다름). 알아내는 가장 쉬운 방법은

import six
six.MAXSIZE
9223372036854775807

이것은 문서에 따라 list및 의 최대 크기를 제공합니다.dict