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 | 반복 계산 제거 |