Python 데이터 엔지니어링 고급 문법 가이드
개요 : 데이터 엔지니어링에서는 대용량 처리, 시스템 자원 관리, 최적화 기술이 필수입니다. 이 글은 Python 상급자를 위한 데이터 엔지니어링 최적화 문법을 설명하고 실무 적용 예제를 제공합니다.
1. 제너레이터로 대용량 파일 처리
yield 키워드를 이용한 제너레이터는 메모리를 최소화하며 스트리밍 데이터를 처리할 수 있습니다.
예시 | 코드 |
---|---|
제너레이터로 텍스트 파일 읽기 |
def read_large_file(path): with open(path, "r") as f: for line in f: yield line.strip() for row in read_large_file("log.txt"): process(row) |
2. 컨텍스트 매니저로 자원 관리
with
구문과 __enter__/__exit__
메서드를 통해 DB나 파일을 안전하게 사용할 수 있습니다.
예시 | 코드 |
---|---|
SQLite 연결 자동 정리 |
import sqlite3 with sqlite3.connect("data.db") as conn: cur = conn.cursor() cur.execute("SELECT * FROM users") print(cur.fetchall()) |
3. 데코레이터로 파이프라인 추상화
로깅, 예외 처리, 모니터링 등을 데코레이터로 함수에 주입하여 파이프라인 로직을 정리할 수 있습니다.
예시 | 코드 |
---|---|
로그 데코레이터 |
def log_step(func): def wrapper(*args, **kwargs): print(f"[LOG] 실행: {func.__name__}") return func(*args, **kwargs) return wrapper @log_step def extract(): print("데이터 추출 중...") extract() |
4. 병렬 처리로 작업 시간 단축
concurrent.futures
를 활용하면 I/O 또는 CPU 작업을 멀티스레드/프로세스로 빠르게 수행할 수 있습니다.
예시 | 코드 |
---|---|
ThreadPoolExecutor 예시 |
from concurrent.futures import ThreadPoolExecutor def fetch_data(url): return f"{url} 완료" urls = ["url1", "url2", "url3"] with ThreadPoolExecutor(max_workers=3) as executor: results = executor.map(fetch_data, urls) for r in results: print(r) |
5. 함수형 프로그래밍으로 파이프라인 구성
map, filter, lambda, reduce를 활용하여 선언형으로 데이터를 처리할 수 있습니다.
예시 | 코드 |
---|---|
map/filter/reduce 활용 |
from functools import reduce data = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, data)) even = list(filter(lambda x: x % 2 == 0, data)) summed = reduce(lambda x, y: x + y, data) print(squared, even, summed) |
6. 캐시로 중복 계산 제거
@lru_cache를 이용해 함수 결과를 저장하면 반복 계산을 줄여 성능 향상에 도움이 됩니다.
예시 | 코드 |
---|---|
LRU Cache 활용 |
from functools import lru_cache @lru_cache(maxsize=128) def heavy_task(n): print(f"계산 중: {n}") return n * n print(heavy_task(10)) print(heavy_task(10)) # 캐시에서 반환 |
요약 정리
주제 | 핵심 문법 | 활용 목적 |
---|---|---|
제너레이터 | yield | 스트리밍 처리 |
컨텍스트 매니저 | with, __enter__, __exit__ | DB/파일 정리 자동화 |
데코레이터 | @decorator | 로깅, 에러 핸들링 |
병렬 처리 | concurrent.futures | 멀티스레딩/멀티프로세싱 |
함수형 프로그래밍 | map, filter, lambda, reduce | 데이터 흐름 처리 |
캐싱 | @lru_cache | 반복 계산 제거 |