기본 콘텐츠로 건너뛰기

추천 가젯

리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 2편

모바일 청첩장 시리즈 2편 · R2 갤러리 & Firebase 방명록 Cloudflare R2 · Functions Firebase Firestore 클라우드플레어 R2로 갤러리 저장하고, Firebase로 방명록 달기 안녕하세요, 병민입니다 🙌 1편에서 전체 흐름을 잡았고, 이번엔 사진 업로드/보관 과 방명록 을 연결합니다. 서버는 따로 없고 Cloudflare Pages 를 쓰고 있으니, Pages Functions (= 워커)로 R2에 사전서명 URL을 만들어주고, 프론트에서 그 URL로 바로 업로드하는 구조예요. 방명록은 Firebase DB로 간단·안전하게! 전체 그림 프론트(React) → /api/r2/upload 로 업로드용 URL 요청 → R2에 파일 PUT 프론트(React) → /api/r2/list 로 목록 요청 → 갤러리 렌더 프론트(React) → Firebase SDK로 방명록 작성/조회 1) R2 버킷 & Pages Functions 준비 Cloudflare 대시보드 > R2 > Create bucket (예: wedding-gallery ) 버킷 > Settings > CORS 에서 사이트 도메인 허용(예: https://*.pages.dev , 커스텀 도메인) Pages 프로젝트 > Settings > Functions 에서 R2 바인딩 추가: ...

🔍 파이썬 itertools 모듈 고급 활용 및 실전 사례

Itertools icon

🔍 파이썬 itertools 모듈 고급 활용 및 실전 사례

itertools는 반복자 도구 모음으로, 데이터 처리, 알고리즘, 조합 생성 등 다양한 상황에서 성능 좋고 간결한 코드 작성을 돕습니다. 단순 소개를 넘어 실무에서 활용할 수 있는 고급 팁을 포함했습니다.

1. `product()` – 고려해야 할 경우의 수 생성

import itertools

colors = ['red', 'green', 'blue']
sizes = ['S','M','L']
quantities = [1,2]
for c, s, q in itertools.product(colors, sizes, quantities):
    print(f"{c}-{s}: {q}개")
  • ✏️ 실제 재고 시스템에서는 variant data 생성에 유용.
    💡 단, **곱셈 급증**에 주의하세요. (3×3×2=18개 생성)

2. `combinations`, `permutations` + `max_length` 필터링

import itertools

items = ['A','B','C','D']
# 3개 조합
for combo in itertools.combinations(items, 3):
    print(combo)

# 길이 2 순열 + 조건 필터링
for perm in itertools.permutations(items, 2):
    if perm[0] < perm[1]:
        print(perm)
  • 조건 필터링은 순열 생성 비용이 커질 수 있으므로, **읽기/추론 전 필터링 구조 설계** 권장.

3. `accumulate()` + 누적 통계 구현

import itertools, operator

data = [3, 1, 4, 1, 5, 9]
sum_seq = list(itertools.accumulate(data))
prod_seq = list(itertools.accumulate(data, operator.mul))
print("누적 합:", sum_seq)
print("누적 곱:", prod_seq)
  • 📊 실무에서 moving average 구현에 쉽게 응용 가능.
  • 연속 점수 누적 합, 재고 잔량 계산 등에 유용.

4. `groupby()` + 정렬이 중요한 이유

import itertools

records = [
    {'age': 30, 'name':'Alice'},
    {'age': 25, 'name':'Bob'},
    {'age': 30, 'name':'Charlie'},
]
records.sort(key=lambda x: x['age'])
for age, group in itertools.groupby(records, key=lambda x: x['age']):
    names = [r['name'] for r in group]
    print(age, names)
  • ⚠️ 꼭 **정렬된 시퀀스에서만** 예상된 그룹화 결과.

5. `tee()` + 병렬 흐름 처리

import itertools

data = range(1, 5)
it1, it2 = itertools.tee(data, 2)
print(list(it1))
print(list(it2))
  • ⚙️ 데이터 스트림을 병렬로 분기해 다양한 분석에 활용 가능.
  • 메모리 복제 비용 주의 – 적은 요소에서만 사용 권장.

6. 성능 비교 – 직접 vs itertools

import timeit, itertools

setup = "data = list(range(1000))"
t1 = timeit.timeit("sum(x*x for x in data)", setup=setup, number=1000)
t2 = timeit.timeit("sum(itertools.accumulate(data, lambda a,b: a+b*b))", 
                   setup=setup + "\nimport itertools", number=1000)
print(t1, t2)
  • 🧪 `itertools`는 **지연 평가(lazy evaluation)** 특성 덕분에 큰 데이터에서 유리할 수 있습니다.

✨ 요약 & 활용 팁

  • product(): 다중 조합 생성 시 유용하지만 결과 수 폭발 주의
  • combinations/permutations: 필터링과 함께 사용하면 성능 최적화 가능
  • accumulate(): 누적 통계, 이동 평균 등에 직관적 구현
  • groupby(): 정렬 후 그룹화, 데이터 요약에 필수
  • tee(): 반복자 복제 시 편리하지만 메모리 비용 확인 필요
  • 성능 테스트를 통해 **itertools와 일반 comprehension** 비교해보세요

댓글

가장 많이 본 글

Icons by Flaticon