기본 콘텐츠로 건너뛰기

추천 가젯

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

모바일 청첩장 시리즈 1편 · 기획/스택/배포 리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 1편 안녕하세요, 이번에 결혼 준비를 하면서 여자친구와 같이 모바일 청첩장 을 만들고 있어요. 여자친구가 디자인을 해서 전달해주면 제가 개발을 진행하고 있어요. 이 글은 구현기 1편 으로, 전체 흐름과 스택, 배포 구성까지 “부담 없이” 훑어봅니다. (코드는 여러 버전 테스트 중!) 이 글에서 보는 것 왜 SPA 모바일 청첩장인가? 기본 스택 & 폴더 구조 라우팅 선택: HashRouter가 편한 이유 Cloudflare Pages로 자동 배포 현재 진행 중인 UI 버전들(테스트 기록) 1) 왜 SPA 모바일 청첩장인가? 모바일 청첩장은 핵심이 명확해요. 가볍고 빠르고 끊김이 없어야 하고, 사진/지도/일정이 터치에 친화적 이어야 합니다. 그래서 React + Vite 로 싱글 페이지 앱(SPA)을 구성했고, 정적 호스팅(CDN)인 Cloudflare Pages 에 올려 GitHub 푸시 → 자동 배포 까지 한 번에 묶었습니다. UX 팁 · 이미지 WebP, loading="lazy" 기본 · 큰 터치 타깃 · BGM은 “사용자 탭 후” 재생(모바일 정책) 2) 기본 스택 & 폴더 구조 서버는 따로 두지 않았고, 정적 빌드 결과물( dist/ )만 올립니다. 현재 의존성은 아래와 같아요. package.json(요약) { "name": ...

🔍 파이썬 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