답변:
소스 코드 에 따르면 목록의 최대 크기는 PY_SSIZE_T_MAX/sizeof(PyObject*)
입니다.
PY_SSIZE_T_MAX
pyport.h 에 정의되어 있습니다.((size_t) -1)>>1
일반 32 비트 시스템에서는 (4294967295/2) / 4 또는 536870912입니다.
따라서 32 비트 시스템에서 파이썬 목록의 최대 크기는 536,870,912 요소입니다.
보유한 요소의 수가 이보다 작거나 같으면 모든 목록 기능이 올바르게 작동해야합니다.
PyObject *
. 그것은 소위 포인터입니다 (끝에 별표가 있기 때문에 인식 할 수 있습니다). 포인터는 4 바이트 길이이며 할당 된 객체에 대한 메모리 주소를 저장합니다. 4 바이트로 오늘날 컴퓨터의 메모리에있는 모든 요소를 처리 할 수 있기 때문에 4 바이트 길이입니다.
PY_SSIZE_T_MAX
있습니다.
현상태대로 파이썬 문서 말한다 :
sys.maxsize
플랫폼의 Py_ssize_t 유형에서 지원하는 가장 큰 양의 정수, 따라서 최대 크기 목록, 문자열, dict 및 기타 많은 컨테이너가 가질 수 있습니다.
내 컴퓨터 (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
그러나 다른 사람들이 말했듯이 확실합니다. 어레이가 클수록 작업 속도가 느려집니다.
목록의 성능 특성 Effbot에 설명되어 있습니다.
Python 목록은 실제로 빠른 임의 액세스를위한 벡터로 구현되므로 컨테이너는 기본적으로 메모리에있는 공간만큼 많은 항목을 보유합니다. (목록에 포함 된 포인터를위한 공간과 가리키는 개체를위한 메모리 공간이 필요합니다.)
추가는 O(1)
(상각 된 상수 복잡도)이지만, 시퀀스 중간에서 삽입 / 삭제하려면 O(n)
(선형 복잡도) 재정렬 이 필요하며 목록의 요소 수만큼 느려집니다.
비교 작업에 무제한의 시간이 소요될 수 있으므로 정렬 질문이 더 미묘합니다. 정말 느린 비교를 수행하는 경우 Python의 목록 데이터 유형의 결함은 아니지만 시간이 오래 걸립니다 .
반전은 목록의 모든 포인터를 교체하는 데 필요한 시간 만 걸립니다 ( O(n)
각 포인터를 한 번 터치하기 때문에 필요 (선형 복잡도)).
x64 비트 시스템에서 이걸 얻었습니다 : Python 3.7.0b5 (v3.7.0b5 : abb8802389, 2018 년 5 월 31 일, 01:54:01) [MSC v.1913 64 비트 (AMD64)] on win32
목록 번호에는 제한이 없습니다. 오류를 일으키는 주된 이유는 RAM입니다. 메모리 크기를 업그레이드하십시오.
sizeof(PyObject*) == 4?
? 이것은 무엇을 의미합니까?