개요 : 이 글은 Python에 능숙한 상급 개발자를 위한 고급 기능 학습 콘텐츠입니다. 제너레이터, 데코레이터, 컨텍스트 매니저, 병렬 처리, 모듈 최적화를 중심으로 설명하며, 모든 기능은 실무에서 활용할 수 있는 강력한 도구입니다.
1. 제너레이터 (Generator)
yield 키워드를 사용해 함수의 상태를 유지하며 값을 순차적으로 반환합니다. 메모리 효율적인 반복 처리를 위해 자주 사용됩니다.
개념 | 예시 코드 |
---|---|
제너레이터 함수 정의 |
def count_up_to(max): count = 1 while count <= max: yield count count += 1 for num in count_up_to(5): print(num) |
2. 데코레이터 (Decorator)
기존 함수를 변경하지 않고 기능을 확장할 수 있게 해주는 문법입니다. 로깅, 캐싱, 권한 체크 등에 활용됩니다.
개념 | 예시 코드 |
---|---|
함수에 데코레이터 적용 |
def log(func): def wrapper(*args, **kwargs): print("함수 실행 전 로그") return func(*args, **kwargs) return wrapper @log def greet(name): print(f"안녕하세요, {name}님!") greet("철수") |
3. 컨텍스트 매니저 (Context Manager)
with 구문을 통해 리소스를 안전하게 관리할 수 있습니다. 파일, DB 커넥션, 락(lock) 등에 사용되며, __enter__
/ __exit__
메서드가 핵심입니다.
개념 | 예시 코드 |
---|---|
사용자 정의 컨텍스트 매니저 |
class FileLogger: def __enter__(self): self.file = open("log.txt", "w") return self.file def __exit__(self, exc_type, exc_value, traceback): self.file.close() with FileLogger() as f: f.write("로그 기록 시작\n") |
4. 병렬 처리 (Multiprocessing & Threading)
Python의 GIL(Global Interpreter Lock) 제약을 회피하기 위해 multiprocessing
또는 threading
모듈을 사용합니다. CPU 작업은 프로세싱, I/O 작업은 스레드가 유리합니다.
개념 | 예시 코드 |
---|---|
multiprocessing 예제 |
from multiprocessing import Process def task(name): print(f"{name} 작업 실행 중") if __name__ == '__main__': p1 = Process(target=task, args=("프로세스1",)) p2 = Process(target=task, args=("프로세스2",)) p1.start() p2.start() p1.join() p2.join() |
5. 성능 최적화와 모듈화
상급자는 코드 실행 속도와 메모리 효율을 고려한 프로파일링, 캐싱, 함수형 프로그래밍 기법 등을 사용할 수 있어야 합니다.
개념 | 예시 코드 |
---|---|
LRU 캐싱을 활용한 성능 향상 |
from functools import lru_cache @lru_cache(maxsize=1000) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2) print(fib(30)) |
요약 정리
주제 | 핵심 내용 |
---|---|
제너레이터 | yield, lazy evaluation |
데코레이터 | 함수 기능 확장, 중첩 함수 |
컨텍스트 매니저 | 리소스 안전 처리, with문 사용 |
병렬 처리 | multiprocessing vs threading |
성능 최적화 | lru_cache, 프로파일링, 함수형 패턴 |