Python에서 목록은 얼마나 커질 수 있습니까? 약 12000 개의 요소 목록이 필요합니다. 정렬 등과 같은 목록 메서드를 계속 실행할 수 있습니까?
답변
소스 코드 에 따르면 목록의 최대 크기는 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 요소입니다.
보유한 요소의 수가 이보다 작거나 같으면 모든 목록 기능이 올바르게 작동해야합니다.
답변
현상태대로 파이썬 문서 말한다 :
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
