반응형
파이썬은 예전부터 간단한 리스트 컴프리헨션, map(), filter() 함수로 함수형 프로그래밍(FP) 스타일을 지원했습니다. 하지만 복잡한 데이터 처리 로직을 구현할 때는 여전히 for 루프가 길어지거나, 중간 중간 임시 변수를 많이 선언하는 경우가 발생할 수 있었습니다.functools, itertools 모듈은 이러한 문제를 해결하기 위한 고급 함수형 툴셋을 제공하여, 데이터 변환, 그룹화, 누적 연산 등을 더 직관적이고 Pythonic하게 처리할 수 있게 합니다.이번 글에서는 기존 방식과 새로운 함수형 접근법의 비교, 주요 함수 및 장단점을 살펴봅니다.이전에는 어떻게 했을까?전통적 for 루프 기반 처리data = [1, 2, 3, 4, 5]# 짝수만 제곱해서 합산하기result = 0for x..
기존 파이썬 코드에서는 파일, 네트워크 소켓, DB 커넥션 등 자원 사용 후 수동으로 정리(닫기)해야 했습니다. 이를 위해 try-finally 블록을 사용했지만, 매번 이런 보일러플레이트를 작성하는 것은 번거롭고, 예외 발생 시 자원 반납 처리 누락 등의 문제가 생기기 쉬웠습니다.Context Manager와 with문을 사용하면 이러한 자원 정리 과정을 자동화하고, 코드 가독성과 안전성을 크게 향상시킬 수 있습니다.이번 글에서는 기존 방식과 새로운 방식의 비교, Context Manager 개념, with문 사용 예제, 장단점을 살펴봅니다.이전에는 어떻게 했을까?try-finally를 통한 수동 자원 정리f = open("data.txt", "r")try: content = f.read()fin..
과거 파이썬 코드에서는 복잡한 if-elif 체인이나 dict 매핑으로 다양한 조건 분기를 처리했습니다. 이 방식은 조건이 많아질수록 코드 가독성이 떨어지고, 나중에 새로운 조건을 추가할 때 수정 범위가 커지는 문제를 일으킵니다. Python 3.10부터 도입된 match 문(Structural Pattern Matching)은 이런 상황에서 훨씬 더 선언적이고 구조적인 패턴 기반 분기 로직을 구현할 수 있도록 지원합니다.이번 글에서는 기존 조건문 처리 방식과 패턴 매칭의 차이, 패턴 매칭 도입 시 장단점을 살펴봅니다.이전에는 어떻게 했을까?복잡한 if-elif 체인command = "start"if command == "start": action = "Launching..."elif command..
예전에는 파이썬 패키지를 만들 때 setup.py, requirements.txt, MANIFEST.in 등 여러 파일을 관리해야 했고, 의존성 관리도 pip와 virtualenv로 수동 처리하곤 했습니다. PEP 518로 제안된 pyproject.toml은 프로젝트 빌드 시스템 표준을 정의하고, Poetry 같은 툴을 이용하면 의존성 관리, 빌드, 배포까지 한 번에 해결할 수 있습니다.이번 글에서는 기존 방식과 새 방식의 비교, pyproject.toml과 Poetry의 장단점, 기본 사용법을 다룹니다.이전에는 어떻게 했을까?setup.py + requirements.txt 방식setup.py로 패키지 메타데이터(이름, 버전, 의존성) 정의requirements.txt로 개발 의존성 관리패키지 빌드/배..
과거 파이썬에서 동시성이나 병렬 처리를 구현하려면 threading이나 multiprocessing 모듈을 직접 다루며 복잡한 스레드 생성, 락(Lock) 관리, 프로세스간 통신(IPC) 코드를 작성해야 했습니다. 이는 코드가 장황해지고 디버깅이 어려워지는 문제를 일으켰습니다.Python 3.2+에서 도입된 concurrent.futures 모듈과 3.4+의 asyncio는 이러한 문제를 완화하고, 더 직관적이고 Pythonic한 방식으로 동시성 작업을 처리할 수 있게 합니다.이번 글에서는 기존 접근법과 새로운 접근법을 비교하고, 각 방법의 장단점을 정리합니다.이전에는 어떻게 했을까?threading, multiprocessingimport threadingdef worker(): # 작업 처리 ..
기존 파이썬 코드에서는 파일 경로를 다룰 때 os.path 모듈을 주로 사용했습니다. 하지만 이 방식은 문자열 기반으로 경로를 처리하므로 플랫폼별 경로 구분자 문제, 문자열 연산 남용, 가독성 저하가 발생할 수 있습니다. Python 3.4+에서 도입된 pathlib는 경로를 객체(클래스)로 다루며, 연산자 오버로딩을 통해 훨씬 직관적인 파일 경로 조작을 가능하게 합니다.이번 글에서는 os.path 대비 pathlib의 사용법, 장단점, 예제 코드를 소개합니다.예전에는 어떻게 했을까?os.path 방식경로 결합, 체크, 생성 등 대부분의 작업을 문자열 조작으로 처리해야 했습니다.import osbase_dir = "/path/to"filename = "data.txt"full_path = os.path...
과거에는 단순히 데이터만 담는 클래스(예: DTO, VO)를 정의할 때도 __init__, __repr__, __eq__ 등을 일일이 작성해야 했습니다. 그러나 Python 3.7부터 @dataclass 데코레이터를 사용하면 이러한 반복적인 코드를 자동으로 생성할 수 있어, 데이터 구조 정의가 훨씬 단순해집니다.이번 글에서는 전통적인 클래스 구현 방식과 dataclass를 비교하고, dataclass 사용 시 장단점, 주의점을 살펴봅니다.이전에는 어떻게 했을까?전통적인 클래스 구현 예class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): r..
이전까지는 CartPole처럼 왼/오 행동을 선택하는 이산적 행동 공간 문제를 다뤘습니다. 하지만 실제 응용(로봇 제어, 자율주행, 제어 시스템)은 연속적 행동(예: 모터 토크, 휠 각도)을 요구합니다. 이산적 행동 공간용 Q-learning 계열 알고리즘을 그대로 적용하기 어렵기 때문에, 연속 행동 공간에 맞는 알고리즘이 필요합니다.SAC(Soft Actor-Critic)는 연속 행동 공간을 다루는 최신 Actor-Critic 알고리즘 중 하나로, 다음과 같은 특징을 갖습니다.Off-policy Actor-Critic: 리플레이 버퍼를 사용, 데이터 효율적자동 온도 파라미터 조정: 탐사(Exploration)와 활용(Exploitation) 사이의 균형을 맞추는 엔트로피 보상(Entropy Regula..
A2C까지는 정책과 가치를 동시에 학습하는 Actor-Critic 방법론의 기본을 익혔습니다. 그러나 A2C나 A3C, TRPO 같은 알고리즘들은 정책 업데이트 과정에서 제한이 명확하지 않아, 큰 갱신으로 인한 성능 퇴보가 발생할 수 있습니다.PPO(Proximal Policy Optimization)는 이를 개선하기 위해 다음과 같은 핵심 아이디어를 제안합니다.정책 업데이트 시, 새로운 정책과 기존 정책의 차이를 '클리핑(clipping)'하여, 정책이 한 번에 크게 바뀌지 않도록 제약이로써 안정적인 학습이 가능해지고, 복잡한 수학적 보증이 필요한 TRPO보다 구현이 단순하며, 널리 사용되는 SOTA급 RL 알고리즘으로 자리매김핵심 개념:Probability Ratio (r):r(θ) = π_θ(a|s..
정책기반 접근(REINFORCE)은 정책을 직접 파라미터화하고, 에피소드가 끝난 후 누적보상을 이용해 정책 그래디언트를 업데이트합니다. 이 방법은 개념적으로 간단하지만, 다음과 같은 단점이 있습니다.고분산 업데이트: 에피소드 단위로 G(Return)를 계산하므로, 긴 에피소드나 복잡한 문제에서는 분산이 매우 커져 업데이트 효율이 떨어집니다.느린 반응: 에피소드가 끝나야만 업데이트가 이루어지므로 실시간 반응이 어려움.Actor-Critic 접근은 이러한 문제를 완화합니다. 여기서 에이전트는 두 가지 신경망(또는 하나의 공유 신경망)을 갖습니다.Actor(정책 네트워크): πθ(a|s)를 파라미터화하여, 상태에서 행동 확률분포를 출력 (정책기반)Critic(가치추정 네트워크): Vψ(s)를 파라미터화하여, ..