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


119

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

답변:


193

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

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

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

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

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


4
sizeof(PyObject*) == 4?? 이것은 무엇을 의미합니까?
Matt

4
@Matt는 단일 PyObject *. 그것은 소위 포인터입니다 (끝에 별표가 있기 때문에 인식 할 수 있습니다). 포인터는 4 바이트 길이이며 할당 된 객체에 대한 메모리 주소를 저장합니다. 4 바이트로 오늘날 컴퓨터의 메모리에있는 모든 요소를 ​​처리 할 수 ​​있기 때문에 4 바이트 길이입니다.
Antonio Ragagnin 2015

1
(Álvaro Justen의 답변에서 알 수 있듯이) 다른 컴퓨터, 특히 64 비트 시스템을 실행하는 컴퓨터에서는의 가치가 매우 클 수 있다는 점에 주목할 가치가 PY_SSIZE_T_MAX있습니다.
ClydeTheGhost

@ClydeTheGhost, 64 비트 시스템을 실행하는 시스템이 536,870,912 요소보다 더 낮은 최대 크기를 가질 수 있는지 여부를 지정할 수 있습니까? 아니면 크게 다를 수 있지만 항상 536,870,912 요소보다 크거나 같은 최대 크기를 가질 수 있습니까?
에서

1
@at 64 비트 시스템의 최대 값은 항상 32 비트 시스템의 최대 값보다 크거나 같습니다.
ClydeTheGhost

71

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

sys.maxsize

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

내 컴퓨터 (Linux x86_64) :

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

어떻게 수행이 답변으로 질문
ldgorman

11
@ldgorman sys.maxsize이 질문에 대한 답입니다. 다른 아키텍처는 다른 최대 값을 지원합니다.
Simon Kuang

2
9223372036854775807 요소? 정말? 이것은 가장 많이 찬성 된 답변과도 크게 다릅니다.
akki

13
@akki 허용되는 대답은 32 비트 시스템을 참조하는 것입니다. 그것은 2016 년이기 때문에, 나는 당신이 64 비트 시스템에있는 대답은, 따라서 올바른 가정합니다
브라이언 리치

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

13
@dF : 대단해! 0.024s는 나에게 너무 길었고 이제 그 걱정을 그만 둘 수있어 기쁩니다.
Thomas Edleson

6

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

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

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


5

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

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

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

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

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


4

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


3

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

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


1
문서가 아닙니다
Boris

1

사용 가능한 총 RAM 양에 의해서만 제한됩니다. 분명히 어레이가 클수록 작업이 더 오래 걸립니다.


4
일반적으로 사실이지만 전부는 아닙니다. 추가는 배열의 크기에 관계없이 상각 된 일정 시간으로 유지됩니다.
2009 년

0

x64 비트 시스템에서 이걸 얻었습니다 : Python 3.7.0b5 (v3.7.0b5 : abb8802389, 2018 년 5 월 31 일, 01:54:01) [MSC v.1913 64 비트 (AMD64)] on win32

여기에 이미지 설명 입력


1
세부 사항과 다른 사람들이 자신의 한계를 찾을 수있는 방법에 대해 조금 확장하면 훌륭한 대답이 될 것입니다.
Shayaan

-16

목록 번호에는 제한이 없습니다. 오류를 일으키는 주된 이유는 RAM입니다. 메모리 크기를 업그레이드하십시오.


9
-1은 실제로 질문에 대답하지 않고 (다른 답변에서 볼 수 있듯이) 목록에 실제로 최대 크기가 있기 때문에 실제로 오해의 소지가 있기 때문입니다.
ClydeTheGhost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.