Computer/Coding Tests

[코딩 테스트]정렬 문제로 알아보는 Python 자료구조 비교(tuple, namedtuple, struct, class +__slots__)

이르리의 공부일지 2025. 3. 21. 16:06

정렬 문제를 푸는데 푸는 방법을 찾아보던 중 다양한 자료구조를 활용할 수 있는 걸 알게됐다.

 

목차

1. 정렬할 때 쓰는 자료구조(더 있을 수 있음.)

2. 쓰고 느낀 장단점(+ GPT 추가 설명)


아래 나열한 방식 중 실제로 써본건 namedtuple과 struct이다.

참고용으로 다 묶어서 올려본다.

# tuple
# tuple 그대로 쓰면 됨
print("Tuple 방식:")
for s in students:
    print(s)

# namedtuple
from collections import namedtuple
student = namedtuple('student', ['id', 'math', 'comp'])
s = student(1, 90, 80)
print(s.id, s.math, s.comp)

# struct
import struct
data = struct.pack('iii', 1, 90, 80)   # int 3개를 바이너리로 인코딩
id, math, comp = struct.unpack('iii', data)
print(id, math, comp)

# class + __slots__
class Student:
    __slots__ = ['id', 'math', 'comp']  # 메모리 최적화

    def __init__(self, id, math, comp):
        self.id = id
        self.math = math
        self.comp = comp
        
        
    def __repr__(self):  # 보기 좋게 출력
        return f"Student(id={self.id}, math={self.math}, comp={self.comp})"

...

print("\nClass + __slots__ 방식:")
for s in students:
    print(s)

 

 

느낀점 + 찾아본 바

1. namedtuple의 경우, 쓰기에도 편하고 객체에 대한 이름을 명시할 수 있어서 좋지만 '메모리가 많이 쓰이지 않을까?'하는 의문이 들고,

2. struct의 경우, 단점이라 하면 packing, unpacking이 필요하고 'iii'(정수형, 공식문서 참고)와 같이 포맷문자를 써야한다는 점이다.

(문제풀 때는 바로바로 해야하는데 포맷문자 떠올리고 있을 여유 같은 건 없다!)(물론 struct 예제 올려주신 분께는 감사)

3. tuple은 namedtuple과 다르게 인덱스로 값에 접근하니까 가독성이 떨어진다는 점이 있고(그 외에는 namedtuple과 쓰는 방식에 있어 차이는 없다.)

4. class + __slots__는 GPT가 제시해줘서 쓴 건데, struct 모듈을 쓰지 않고 class를 이용해 구조체 struct와 같이 쓰는 방법이라고 한다. 메모리 절약에 도움되는 방식이라고 한다. (비슷한 기능하는 namedtuple 있는데 길게 코드를 써야하니까 코테용으로는 탈락! 실무용으로는 적합한 때가 있을 듯.)

 


궁금증 

Q 어떤 자료구조가 제일 쓰기 좋은지 메모리, 실행 시간, 사용간편성 등의 측면에서 궁금하다.

 

궁금증 해소

A (GPT)

더보기

✅ 비교 포인트

항목 tuple namedtuple class + __slots__ struct (binary)
가독성 🔴 낮음 🟢 높음 🟢 높음 🔴 매우 낮음
메모리 사용 🟢 매우 낮음 🟡 낮음 🟡 낮음 🟢 매우 낮음 (진짜 raw)
생성 속도 🟢 빠름 🟡 빠름 🔴 조금 느림 🟢 매우 빠름 (pack만 쓰면)
접근 편의성 🔴 인덱스만 🟢 필드 이름 가능 🟢 필드 이름 가능 🔴 unpack 필요함
불변성 🟢 예 🟢 예 🔴 아니오 🟢 예
사용 난이도 🟢 쉬움 🟢 쉬움 🟡 보통 🔴 어렵고 번거로움
주 용도 일반 자료 구조 가독성 좋은 자료 구조 간단한 클래스 구조 바이너리 처리, 속도 최적화
활용도 빠르고 간단한 작업 알고리즘/대회 👍 OOP, 확장성 바이너리 I/O, 속도 극한

 

 

자료구조별 실행시간 비교
  Method Time (seconds)
0 Tuple 0.2894313509999980
2 Class + __slots__ 0.313633363000001
3 Struct 0.46034554399999900
1 NamedTuple 0.5529098539999990

 

 

자료구조별 최대 메모리 사용량 비교
  Method Peak Memory (KB)
3 Struct 487.03125
0 Tuple 673.6640625
2 Class + __slots__ 861.1640625
1 NamedTuple 939.2890625

 


결론

1. 코테용: namedtuple 쓰자.

쓰기 편하고 웬만한 효율도 잘 나온다.

 

그 외...

2. 메모리 최대 절약: struct

3. 실행시간 최대 절약: tuple

4. 확장성 고려: class + __slots__

 

 

+) 궁금증 해소 부분은 GPT 참고이므로 틀린 점이 있을 수 있음. 참고만,,,