C.W.K.
Stream
Lesson 09 of 12 · published

최적화 기법

~8 min · performance, optimization

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

최적화 hierarchy

최적화 전 측정. 대부분 정규식 성능 "문제" 가 사실 의상 입은 정확성 문제. 그 caveat 와 함께, 영향 순서로 기법:

1. 재사용 패턴 컴파일

컴파일이 패턴 한 번 파싱. 런타임이 컴파일된 state machine 사용. 루프 또는 반복 호출 함수에 사용된 어떤 패턴이든 모듈 레벨의 re.compile.

2. 패턴 anchor

^pattern 이 엔진이 모든 위치에서 재시도 막음. 검증 패턴에 거대한 speedup.

3. Alternation 을 character class 로 교체

[abc](a|b|c) 보다 극적 빠름. 엔진이 specialized character class machinery 가짐.

4. Atomic 그룹 / negated class 로 backtracking 회피

"X 까지 모든 거" 위한 [^X]+.*?X 를 속도와 정확성 모두 이김. Backtrack 안 해야 한다 아는 run 엔 atomic 그룹.

5. 패턴을 왼쪽부터 specific 하게

엔진이 왼쪽에서 오른쪽 읽음. \d 시작 패턴이 비-숫자 텍스트 즉시 거부. .* 시작 패턴이 포기 전 모든 위치 시도.

6. 옳은 엔진 사용

거대 파일에 bulk 텍스트 처리엔 ripgrep (RE2) 가 어떤 backtracking 기반 거든 outperform. One-off 작업엔 re OK.

7. 현실적 입력에 테스트

테스트 데이터에 빠르게 도는 패턴이 production 데이터에 crawl 가능. 대표 샘플로 프로파일.

Code

최적화 예시·python
import re
import time

# 1. 재사용 패턴 컴파일
DATE = re.compile(r'\d{4}-\d{2}-\d{2}')  # 한 번
# DATE.findall(text) 반복 사용

# 2. 가능하면 anchor
bool(re.fullmatch(r'^\d+$', '12345'))  # 매우 빠름 — anchored

# 3. Character class 가 alternation 이김
# 느림
re.findall(r'(a|b|c|d|e)', 'abcdef' * 1000)
# 빠름
re.findall(r'[abcde]', 'abcdef' * 1000)

# 4. Negated class 가 lazy 이김
text = '"hello" world ' * 1000
start = time.time()
re.findall(r'".*?"', text)
print(f'lazy: {time.time() - start:.3f}s')

start = time.time()
re.findall(r'"[^"]*"', text)
print(f'negated: {time.time() - start:.3f}s')

# 5. Specific prefix
# 느림
re.findall(r'.*=value', 'key=value' * 100)  # 모든 위치 시도
# 빠름
re.findall(r'\b\w+=value', 'key=value' * 100)  # specific anchor

# 6. 큰 파일엔 ripgrep
# rg 'pattern' bigfile.log    — Python re 보다 100MB+ 에 훨씬 빠름

External links

Exercise

본인 코드에서 자주 도는 정규식 잡기. 현실적 데이터에 시간 측정. 리스트에서 한 최적화 적용 (compile, anchor, character class, negated class). 다시 시간 측정. Speedup 문서화 또는 안 중요했다 메모.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.