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

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

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

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



답변

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


답변

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


답변

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

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

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

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


답변

트레이드 오프입니다!

각각의 장점 :

명부

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

배열 (예 : numpy 배열)

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

답변

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


답변

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


답변

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