개요 : 이 글은 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, 프로파일링, 함수형 패턴 |