파이썬 목록 대 배열-언제 사용합니까?


374

1d 배열을 생성하는 경우 List로 구현하거나 표준 라이브러리에서 'array'모듈을 사용할 수 있습니다. 나는 항상 1d 배열에 List를 사용했습니다.

대신 어레이 모듈을 사용하려는 이유 또는 상황은 무엇입니까?

성능 및 메모리 최적화를위한 것입니까, 아니면 명확한 것이 누락 되었습니까?

답변:


438

기본적으로 파이썬리스트는 매우 유연하며 완전히 이질적인 임의의 데이터를 보유 할 수 있으며, 상각 된 일정한 시간 에 매우 효율적으로 추가 될 수 있습니다 . 시간 효율적이고 번거 로움없이 목록을 축소하고 확장해야하는 경우 갈 길이 멀다. 그러나 그들은 C 배열보다 훨씬 더 많은 공간 을 사용 합니다 .

반면에 array.array유형은 C 배열의 얇은 래퍼입니다. 동일한 유형의 동종 데이터 만 보유 할 수 있으므로 sizeof(one object) * length메모리 바이트 만 사용합니다 . 대부분 C 배열을 확장 또는 시스템 호출 (예 : ioctl또는 fctnl) 에 노출해야 할 때 사용해야합니다 .

array.array파이썬 2.x ( ) 에서 가변 문자열 을 나타내는 합리적인 방법 array('B', bytes)입니다. 그러나 Python 2.6+ 및 3.x는로 변경할 수있는 바이트 문자열을 제공합니다 bytearray.

그러나 숫자 데이터의 동종 배열에서 수학 을 수행 하려면 복잡한 다차원 배열에서 연산을 자동으로 벡터화 할 수있는 NumPy를 사용하는 것이 훨씬 좋습니다.

짧은 이야기를 짧게하려면 : 수학 이외의array.array 이유로 동질적인 C 데이터 배열이 필요할 때 유용합니다 .


9
numpy.ndarray는 array.array와 동일한 메모리 공간을 가지고 있습니까?
Gordon Bean

6
@ Gordon, 그것은 큰 연속 배열의 경우 매우 유사해야합니다 : 둘 다 sizeof(element)× (요소 수) 바이트와 오버 헤드를위한 작은 고정 헤더가 필요합니다. 그러나 ndarray에는 불연속 및 희소 배열을 처리하기위한 고급 옵션이 있으며 대형 배열에 메모리를 할당하기위한 플러그 가능한 전략이 있다고 생각합니다 ...이 고급 기능 중 일부는 사용자를 메모리를 적게 만들고 다른 기능은 더 많이 사용하여 성능을 향상시킵니다 기억.
Dan Lenski

또한 마이크로 파이썬으로 마이크로 컨트롤러를 프로그래밍 할 때와 같이 메모리가 문제가 될 때 유용
janscas

일정한 시간에 배열의 i 번째 요소를 조회 할 수 있지만 링크 된 목록에서는 최악의 경우 순서 'n'이 걸립니다. 파이썬 목록에서 i'th 요소의 조회 시간은 무엇입니까?
행복을 추구하는 Nithish 추구

7
@NithishInpursuitOfhappiness에서 파이썬리스트는 링크 된리스트가 아닙니다. 내부적으로 배열로 표시되며 Java의 ArrayList와 동일한 시간 복잡도 특성을 갖습니다. 따라서 파이썬 목록의 i 번째 요소를 가져오고 설정하는 데 일정한 시간 이 걸립니다 . 파이썬 목록에 요소를 추가하면 공간이 부족할 때 배열 크기가 두 배가되기 때문에 상각 된 상수 시간 이 걸립니다 . 파이썬 목록의 중간에 요소를 삽입하거나 제거하려면 요소를 이동해야하므로 O (n) 시간 이 걸립니다 . 자세한 내용은 다음을 참조하십시오 : wiki.python.org/moin/TimeComplexity
geofflee

66

거의 모든 경우에 일반 목록이 올바른 선택입니다. 배열 모듈은 C 배열에 대한 얇은 래퍼와 비슷하며 강력한 형식의 컨테이너 ( docs 참조 )를 제공하며 서명 된 / 서명되지 않은 short 또는 double과 같은 더 많은 C 유사 유형에 액세스 할 수 있습니다. 유형. 배열 모듈은 실제로 필요한 경우에만 사용하고 다른 모든 경우에는 목록을 사용한다고 말하고 싶습니다.


3
가능하지만 실제로 사용하지는 않았지만 일부 마이크로 벤치 마크를 실행하면 흥미로울 것입니다.
André

13
실제로, 나는 빠른 테스트를 수행했습니다-100M 항목으로 목록을 합산하고 해당 배열로 동일한 테스트를 계산하는 시간을 정했으며 실제로 목록은 약 10 % 빠릅니다.
Moe

38
배열 "원시"데이터에 대한 작업은 배열을 읽거나 쓸 때 파이썬 객체를 지속적으로 생성하고 제거해야하므로 목록이 더 빠릅니다.
tzot

7
@Moe, 위의 답변에서 지적했듯이 Python의 내장 기능 array수학을 수행하기위한 것이 아닙니다 . ndarray10 ^ 8 숫자의 배열을 합산하기 위해 NumPy를 시도 하면 완전히 list사라질 것입니다. @tzot는 왜 내장 array이 수학에 느린 지에 대한 올바른 아이디어를 가지고 있습니다.
Dan Lenski

2
방금 테스트했는데 numpy는 내 컴퓨터에서 86.6 배 빠릅니다.
Mark

53

배열 모듈은 왜 그것을 사용 해야하는지 알지 못하면 아마도 필요하지 않은 것들 중 하나입니다 (그리고 나는 그것을 모순하는 방식으로 말하려고하지 않습니다!) . 대부분의 경우 배열 모듈은 C 코드와 인터페이스하는 데 사용됩니다. 실적에 대한 질문에보다 직접적인 답변을 제공하려면 다음 단계를 따르십시오.

배열은 일부 용도의 목록보다 효율적입니다. 알고 있지 않은 어레이를 할당해야하는 경우 어레이가 더 빨라지고 더 적은 메모리를 사용할 수 있습니다. GvR에는 배열 모듈이 승자가 될 수 있는 최적화 일화 가 있습니다 (긴 읽기이지만 가치가 있음).

반면에,리스트가 배열보다 많은 메모리를 소비하는 이유 중 일부는 파이썬이 할당 된 모든 요소가 사용될 때 몇 가지 추가 요소를 할당하기 때문입니다. 즉, 항목을 목록에 추가하는 것이 더 빠릅니다. 따라서 항목을 추가 할 계획이라면 목록을 사용하는 것이 좋습니다.

TL; DR 예외적 인 최적화가 필요하거나 C 코드와 인터페이스해야하고 pyrex를 사용할 수없는 경우에만 배열을 사용합니다 .


1
구체적인 예와 속도 이점에 대해서는 +1입니다. 최고의 답변은 "시간 기억 상충 관계가 있는가?" 그리고 "매우 난해한 메모리 부족 사례가 아닌 용도로 사용하고 있습니까?"
leewz

@leewz 정확하게, 이것은 대답으로 간주되어야합니다.
Gauri Shankar Badola

21

트레이드 오프입니다!

각각의 장점 :

명부

  • 융통성 있는
  • 이기 종일 수 있습니다

배열 (예 : numpy 배열)

  • 균일 한 값의 배열
  • 동종의
  • 소형 (크기)
  • 효율적 (기능 및 속도)
  • 편리한

2
문제는 파이썬에서 배열 모듈에 관한 것입니다. numpy 배열이 아닙니다. 그들은 크기 효율성을 제외하고는 많은 프로를 가지고 있지 않습니다. 그들은 더 빠르지 않습니다.
NONONONONO

14

내 이해는 배열 이보다 효율적으로 저장된다는 것입니다 (즉, 인접한 메모리 블록 대 파이썬 객체에 대한 포인터). 그러나 나는 성능상의 이점을 알지 못합니다. 또한 배열을 사용하면 동일한 유형의 프리미티브를 저장해야하지만 목록은 무엇이든 저장할 수 있습니다.


8

표준 라이브러리 배열은 int 목록을 문자열로 변환하여 웨이브 파일에 쓰는 것과 같이 이진 I / O에 유용합니다. 많은 사람들이 이미 언급했듯이 실제 작업을 수행하려면 NumPy 사용을 고려해야합니다.


6

배열을 사용하려는 경우 numpy 또는 scipy 패키지를 고려하면 훨씬 유연하게 배열을 사용할 수 있습니다.


5

배열은 특정 유형에만 사용할 수있는 반면 목록은 모든 객체에 사용할 수 있습니다.

배열은 한 유형의 데이터 만 가질 수있는 반면, 목록에는 다양한 객체 유형의 항목이있을 수 있습니다.

배열은 일부 수치 계산에 더 효율적입니다.


4
내장 파이썬 배열은 성능면에서 효율적이지 않고 메모리 측면에서만 효율적입니다.
tzot

처리 측면에서 배열이 더 효율적인 경우가 있습니다. 아래 내 게시물을 참조하십시오 : stackoverflow.com/questions/176011/…
Jason Baker

0

numpy 배열과 목록의 중요한 차이점은 배열 슬라이스가 원래 배열의 뷰라는 것입니다. 이는 데이터가 복사되지 않고 뷰에 대한 수정 사항이 소스 배열에 반영됨을 의미합니다.


0

이 답변은 List 및 Array 사용시기에 대한 거의 모든 쿼리를 요약합니다.

  1. 이 두 데이터 유형의 주요 차이점은 수행 할 수있는 작업입니다. 예를 들어, 배열을 3으로 나눌 수 있으며 배열의 각 요소를 3으로 나눕니다. 목록에서도 마찬가지입니다.

  2. 이 목록은 파이썬 구문의 일부이므로 선언 할 필요는 없지만 배열을 사용하기 전에 선언해야합니다.

  3. 다른 데이터 유형의 값을 목록 (이종)에 저장할 수있는 반면, Array에서는 동일한 데이터 유형 (동종)의 값만 저장할 수 있습니다.

  4. 기능이 풍부하고 빠른 어레이는 목록과 비교하여 산술 연산 및 많은 양의 데이터 저장에 널리 사용됩니다.

  5. 배열은 목록에 비해 적은 메모리를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.