본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 메모리 효율을 70% 높이는 array.array 모듈 활용 방법과 List와의 3가지 차이점 해결 가이드

by Papa Martino V 2026. 3. 5.
728x90

array.array 모듈
array.array 모듈

 

파이썬으로 대량의 데이터를 다루다 보면 누구나 한 번쯤 'MemoryError'나 급격한 성능 저하라는 벽에 부딪힙니다. 대부분의 개발자는 기본 자료구조인 리스트(List)를 사용하지만, 데이터의 양이 수백만 개를 넘어서는 순간 리스트는 예기치 못한 메모리 빌런이 되기도 합니다. 오늘 이 글에서는 파이썬 표준 라이브러리에 숨겨진 보석, array.array 모듈을 언제 활용해야 하는지, 그리고 리스트와의 결정적인 차이를 통해 성능 문제를 해결하는 구체적인 방법을 심층 분석합니다.


1. 왜 array.array 모듈인가? 존재의 이유와 핵심 가치

파이썬의 list는 매우 강력하고 유연합니다. 정수, 문자열, 객체를 한곳에 담을 수 있는 '가변 타입 컨테이너'이기 때문입니다. 하지만 이 유연성에는 '메모리 오버헤드'라는 대가가 따릅니다. 리스트의 각 요소는 객체에 대한 포인터(8바이트)를 저장하며, 데이터 타입 정보를 포함하는 객체 자체의 크기도 상당합니다.

반면, array.array는 C 언어의 배열처럼 동일한 타입의 데이터만을 연속된 메모리 공간에 저장합니다. 이는 불필요한 객체 정보를 제거하고 순수 데이터 값만을 담기 때문에, 특히 수치 데이터를 대량으로 처리할 때 독보적인 효율성을 자랑합니다. 전문 개발자라면 데이터의 성격에 따라 최적의 도구를 선택할 줄 알아야 합니다.


2. array.array vs List: 결정적인 3가지 차이점 비교

단순히 '빠르다'거나 '작다'는 설명으로는 부족합니다. 설계를 위해 반드시 알아야 할 구조적 차이를 표로 정리했습니다.

비교 항목 Python List (기본 리스트) array.array (배열 모듈)
저장 방식 객체 참조(포인터) 저장 원시 값(Primitive values) 직접 저장
유연성 다양한 데이터 타입 혼합 가능 단일 타입(Type Code 지정 필요)만 가능
메모리 효율 상대적으로 높음 (오버헤드 큼) 매우 낮음 (C 수준의 밀집 배열)
기능성 다양한 내장 메서드와 범용성 수치 연산 및 파일 I/O에 특화

3. array.array를 활용해야 하는 4가지 결정적 상황

① 수백만 개의 수치 데이터를 다룰 때 (메모리 부족 해결)

모바일 기기나 임베디드 환경, 혹은 대규모 로그 분석 시스템처럼 메모리가 제한된 환경에서 수천만 개의 정수나 실수를 다뤄야 한다면 array.array가 정답입니다. 테스트 결과에 따르면, 1,000만 개의 정수를 저장할 때 리스트 대비 약 3~4배 이상의 메모리를 절약할 수 있습니다.

② 바이너리 파일 읽기/쓰기 작업 시

array.arrayfromfile()tofile() 메서드를 제공합니다. 이는 파이썬 객체를 문자열로 변환하는 복잡한 과정 없이, 메모리에 있는 바이너리 데이터를 즉시 디스크로 덤프하거나 불러올 수 있게 해줍니다. 네트워크 통신이나 파일 처리에 있어서 속도 향상을 즉각적으로 체감할 수 있는 지점입니다.

③ 저수준 시스템 프로그래밍과의 인터페이스

C 언어로 작성된 라이브러리와 데이터를 주고받아야 할 때, array.array는 C의 배열 구조와 호환되므로 매우 유리합니다. buffer_info() 메서드를 사용하면 메모리 주소와 길이를 바로 얻을 수 있어, ctypes 등을 활용한 성능 최적화에 필수적입니다.

④ NumPy를 쓰기엔 너무 가벼운 프로젝트일 때

많은 이들이 수치 계산을 위해 NumPy를 추천하지만, 외부 라이브러리 설치가 제한되거나 프로젝트 무게를 가볍게 유지해야 하는 'Pure Python' 지향 프로젝트에서는 표준 라이브러리인 array 모듈이 최상의 대안이 됩니다.


4. 실전 활용 예제: Sample Example

실제 array.array를 생성하고, 파일에 저장한 뒤 다시 불러오는 코드를 통해 그 간결함을 확인해 보겠습니다.


import array
import os

# 1. 'd' 타입 코드(double, 8바이트 실수)로 배열 생성
numbers = array.array('d', [1.1, 2.2, 3.3, 4.4, 5.5])

# 2. 데이터 추가 (리스트와 유사한 API 제공)
numbers.append(6.6)
numbers.extend([7.7, 8.8])

print(f"생성된 배열: {numbers}")

# 3. 파일로 저장 (바이너리 형식으로 직접 쓰기)
file_path = 'data.bin'
with open(file_path, 'wb') as f:
    numbers.tofile(f)

# 4. 파일에서 읽기
new_numbers = array.array('d')
with open(file_path, 'rb') as f:
    # 파일 크기를 계산하여 8개 요소를 읽어옴
    new_numbers.fromfile(f, 8)

print(f"파일에서 읽은 데이터: {new_numbers}")

# 메모리 사용량 비교 (개념적 차이 설명)
import sys
py_list = [i for i in range(1000)]
py_array = array.array('i', [i for i in range(1000)])

print(f"List 메모리: {sys.getsizeof(py_list)} bytes")
print(f"Array 메모리: {sys.getsizeof(py_array)} bytes")

# 정리
os.remove(file_path)

5. 결론 및 요약

파이썬의 array.array 모듈은 모든 상황에서 리스트를 대체하기 위한 도구가 아닙니다. "데이터 타입이 균일하고, 개수가 방대하며, 메모리 사용량을 최소화해야 할 때" 꺼내 들어야 하는 전문적인 도구입니다. 리스트의 편리함과 배열의 효율성 사이에서 균형을 잡는 것이 시니어 개발자로 가는 첫걸음입니다.

  • 동일 타입의 대량 수치 데이터 처리에는 array.array를 우선 고려하세요.
  • 빠른 파일 I/O와 바이너리 작업이 필요할 때 tofile, fromfile을 활용하세요.
  • 복잡한 객체나 다양한 타입을 섞어서 저장해야 할 때는 기존처럼 list를 사용하세요.

참고 문헌 (Sources)

  • Python Software Foundation. "array — Efficient arrays of numeric values." Python 3.12 Documentation.
  • Fluent Python by Luciano Ramalho (O'Reilly Media) - Chapter 2: An Array of Sequences.
  • Real Python Tutorials: "Memory Management in Python."
728x90