공부/자료구조,알고리즘_python

2. collections 활용 패턴

ha2yong 2025. 10. 22. 13:58

1.  Counter — 토큰/클래스 빈도 분석, 통계 기반 전처리

  • 자연어 처리(NLP)에서 단어 빈도(Word Frequency) 계산
  • 분류(Classification) 문제에서 클래스 불균형 확인
from collections import Counter

# 예: 토큰 빈도 계산
tokens = ["apple", "banana", "apple", "grape", "banana", "apple"]
word_freq = Counter(tokens)

print(word_freq.most_common(2))  # [('apple', 3), ('banana', 2)]

# 예: 데이터셋 클래스 비율 확인
labels = ["cat", "dog", "cat", "bird", "cat", "dog"]
label_dist = Counter(labels)

for cls, cnt in label_dist.items():
    print(f"{cls}: {cnt/len(labels):.2%}")

활용 포인트

  • 토큰 출현 확률(P(word)) 계산 → 언어 모델 확률분포에 사용
  • 클래스 imbalance 체크 후 가중치(weighted loss) 조정
  • TF-IDF 전처리 시 빈도 기반 정규화 계산

2. deque — 실시간 데이터 스트림·슬라이딩 윈도우 버퍼

  • 영상/음성/센서 데이터를 최근 N개만 유지하며 스트림 처리
  • 실시간 추론에서 FPS 고정 or moving average 계산
from collections import deque
import numpy as np

# 최근 30프레임만 유지하는 슬라이딩 윈도우 버퍼
window = deque(maxlen=30)

for frame in stream_generator():  # 예: 실시간 카메라 프레임
    value = model.predict(frame)
    window.append(value)

    # 최근 30프레임 평균값으로 smoothing
    smoothed = np.mean(window)
    print(f"Smoothed output: {smoothed:.2f}")

활용 포인트

  • O(1)로 양끝 삽입/삭제 가능 → FPS 고정 루프에서 효율적
  • LSTM, RNN 등에서 시퀀스 윈도우 관리에 자주 사용됨
  • 실시간 anomaly detection에서도 sliding window 기반 통계 계산

3. defaultdict — 그룹화, 임시 캐시, 파이프라인 중간 결과 저장

  • 데이터셋을 특정 기준으로 그룹핑 (e.g., 클래스별 샘플)
  • 전처리 단계에서 중간 캐시 생성
from collections import defaultdict

samples = [
    ("cat", "img001.jpg"),
    ("dog", "img002.jpg"),
    ("cat", "img003.jpg"),
    ("bird", "img004.jpg"),
]

grouped = defaultdict(list)
for label, path in samples:
    grouped[label].append(path)

print(grouped["cat"])  # ['img001.jpg', 'img003.jpg']

활용 포인트

  • 데이터 로더(DataLoader) 전 단계에서 클래스별 파일 분류
  • 학습 로그나 실험 결과를 태그별로 자동 그룹핑
  • json이나 yaml 구성 파싱 시 누락 키에 안전한 초기화

4. OrderedDict — 모델 레이어 순서, LRU 캐시, 설정 트래킹

  • PyTorch에서 모델 레이어 순서 보존 (nn.Sequential)
  • 최근 사용된 결과 캐싱(LRU)
  • 실험 설정(config) 순서를 명시적으로 기록
from collections import OrderedDict
import torch.nn as nn

model = nn.Sequential(OrderedDict([
    ('conv1', nn.Conv2d(3, 16, 3, padding=1)),
    ('relu1', nn.ReLU()),
    ('conv2', nn.Conv2d(16, 32, 3, padding=1)),
    ('relu2', nn.ReLU())
]))

print(model)

활용 포인트

  • 모델 정의 순서가 정확히 일치해야 reproducibility 확보
  • 학습 로그나 설정 저장 시 순서 보존이 중요할 때
  • OrderedDict.move_to_end() 활용 → 캐시, 최근 접근 관리

5. ChainMap — 다중 설정(environment + config + override)

AI 프로젝트는 여러 환경(config) 파일을 계층적으로 관리
(예: defaults.yaml, local.yaml, args, env)

from collections import ChainMap
import os

defaults = {'batch_size': 32, 'lr': 0.001}
user_cfg = {'lr': 0.0005}
env_cfg = {'batch_size': int(os.getenv('BATCH', 64))}

config = ChainMap(env_cfg, user_cfg, defaults)

print(config['batch_size'])  # 환경 변수 > 사용자 > 기본값 순서

활용 포인트

  • 모델 학습 설정 우선순위 관리
  • 실험 파라미터 병합 시 충돌 최소화
  • Hydra, OmegaConf 같은 config 라이브러리의 핵심 개념과 동일

6. namedtuple — lightweight 데이터 구조 (벡터, 설정, 예측 결과)

  • 딥러닝 inference 결과를 (label, score, bbox) 등으로 관리
  • 벡터/포인트 데이터 구조 표현
from collections import namedtuple

Prediction = namedtuple('Prediction', ['label', 'score', 'bbox'])
preds = [
    Prediction('cat', 0.97, (10, 20, 100, 200)),
    Prediction('dog', 0.83, (30, 40, 120, 240))
]

for p in preds:
    print(f"{p.label}: {p.score*100:.1f}%")

활용 포인트

  • 객체 생성 오버헤드 없이 가벼운 구조체처럼 사용
  • PyTorch Dataset/Batch 내에서 sample 구조 관리
  • 불변이므로 멀티프로세싱(shared memory)에서도 안전

요약표


자료구조 활용 분야 대표 예시
Counter NLP, 데이터 통계 단어/클래스 빈도, TF-IDF
deque 실시간 처리, 슬라이딩 윈도우 FPS smoothing, stream buffer
defaultdict 데이터 그룹화, 캐시 클래스별 샘플 분류
OrderedDict 모델 정의, 캐시 nn.Sequential, LRU cache
ChainMap 설정 병합 config/환경변수 통합
namedtuple 경량 데이터 구조 예측 결과, 좌표, 설정