← 목록으로
지난 소식
코딩 에이전트는 왜 이렇게 멍청할까?
요약
- Python 3.15.0이 UTF-8 기본 인코딩, 지연 임포트, 새로운 내장 타입 추가 등 다양한 기능 개선과 함께 정식 출시되었습니다.
- 실험적 JIT 컴파일러를 통한 성능 향상과 GIL 없이 병렬 실행이 가능한 자유 스레딩 빌드 지원이 주요 특징입니다.
- 또한 새로운 샘플링 프로파일러 Tachyon과 타입 시스템 및 C 확장 지원이 강화되었습니다.
- Python 3.15.0 정식 출시로 UTF-8을 기본 인코딩으로 사용하고, 불변 딕셔너리 frozendict와 고유한 표식 값을 만드는 sentinel 내장 타입 추가
- 명시적 지연 임포트로 모듈을 처음 사용하는 시점까지 로딩을 미뤄 시작 시간을 줄일 수 있으며, 컴프리헨션에서 *와 ** 언패킹 지원
- 실험적 JIT는 pyperformance 벤치마크의 기하평균 기준으로 x86-64 Linux에서 표준 인터프리터보다 7~8%, AArch64 macOS에서 꼬리 호출 인터프리터보다 11~12% 빨라짐
- 새 샘플링 프로파일러 Tachyon으로 실행 중인 프로세스를 코드 수정이나 재시작 없이 분석 가능하며, 프레임 포인터를 기본 활성화해 시스템 도구의 스택 추적 개선
- 자유 스레딩 빌드용 안정 ABI인 abi3t 를 도입하고, TypedDict의 추가 키 타입과 타입 표현식을 받는 API의 어노테이션 지원 확대
시작 시간과 일상적인 코드 작성 개선
- Python 3.15.0은 2026년 10월 9일 출시된 안정판으로, 기여자 1,012명의 커밋 5,643개를 반영함
필요한 시점에 모듈을 로딩하는 지연 임포트
- 명시적 지연 임포트, PEP 810는 lazy import와 lazy from ... import 구문으로 사용 가능
- 임포트한 이름을 처음 사용하는 시점까지 실제 모듈 로딩을 지연
- 파일 상단에 임포트를 모아두면서도, 실행 과정에서 사용하지 않는 모듈의 로딩 비용을 피할 수 있음
- 모듈 로딩에 실패하면 임포트 선언 시점이 아니라 첫 사용 시점에 예외가 발생하며, traceback에 두 위치를 함께 표시
UTF-8 기본 인코딩과 컴프리헨션 언패킹
- UTF-8 기본 인코딩, PEP 686에 따라 시스템 환경과 무관하게 UTF-8을 기본 사용
- open()처럼 인코딩을 명시하지 않은 텍스트 입출력에 적용되며, 명시한 encoding 값은 그대로 사용
- 컴프리헨션 언패킹, PEP 798으로 여러 리스트나 딕셔너리를 하나로 합치는 구문 지원
- [*items for items in lists]로 여러 리스트를 평탄화 가능
- {**items for items in dicts}로 여러 딕셔너리를 병합 가능
- 집합 컴프리헨션과 제너레이터 표현식에도 적용
새 내장 타입과 오류 메시지
- frozendict, PEP 814는 생성 후 항목을 변경할 수 없는 딕셔너리
- 모든 키와 값이 해시 가능하면 frozendict 자체도 딕셔너리 키나 집합 원소로 사용 가능
- 삽입 순서를 유지하지만, 동등성 비교는 순서에 영향을 받지 않음
- sentinel, PEP 661은 값이 제공되지 않았다는 상태 등을 구분하는 고유한 표식 값을 생성
- 복사해도 객체의 동일성을 유지하고, 타입 표현식에서도 사용 가능
- 오류 메시지는 다른 언어의 메서드 이름을 잘못 사용한 경우 Python의 대응 기능을 제안
- 리스트의 .push()에는 .append(), 문자열의 .toUpperCase()에는 .upper()를 제안
- 패키지 시작 구성 파일, PEP 829로 .start 파일 도입
- 인터프리터 시작 시 실행할 함수를 명시해, 시작 과정에서 어떤 코드가 실행되는지 확인하기 쉽게 만듦
실행 성능과 공식 배포본
실험적 JIT 개선
- JIT 컴파일러는 여전히 실험적 기능
- 최적화를 모두 활성화한 빌드의 pyperformance 벤치마크 기준:
- x86-64 Linux: 표준 CPython 인터프리터 대비 기하평균 7~8% 향상
- AArch64 macOS: 꼬리 호출 인터프리터 대비 기하평균 11~12% 향상
- 실행 경로를 기록하는 새 추적 방식, 기본 레지스터 할당, 상수 전파와 참조 카운트 최적화 등을 적용
- 수치는 벤치마크 평균이며, 개별 작업에서는 성능이 낮아지거나 더 크게 향상될 수 있음
플랫폼별 배포 변경
- 공식 Windows 64비트 바이너리는 꼬리 호출 인터프리터를 사용
- 공식 macOS 배포본은 자유 스레딩 지원을 기본 설치
- 자유 스레딩은 GIL 없이 여러 스레드가 Python 코드를 병렬 실행할 수 있는 빌드 방식
실행 중인 프로그램의 성능 분석
- 전용 profiling 패키지 아래에 Python의 프로파일링 도구를 정리
- 기존 cProfile 기능은 profiling.tracing으로 옮기며, 호환성을 위해 cProfile 이름도 유지
- 새 Tachyon 샘플링 프로파일러는 실행 중인 프로세스의 스택을 주기적으로 수집
- 코드 수정이나 프로세스 재시작 없이 성능 분석 가능
- 실제 경과 시간, CPU 실행 시간, GIL 보유 시간 등을 구분해 분석
- 플레임 그래프, 소스 코드별 히트맵, 실시간 터미널 화면 등으로 결과 확인 가능
- 스레드와 비동기 작업의 실행 상태도 분석 가능
- 프레임 포인터, PEP 831를 지원 플랫폼에서 기본 활성화
- 시스템 프로파일러, 디버거, 크래시 분석과 eBPF 도구가 네이티브 호출 스택을 더 빠르고 안정적으로 추적하도록 개선
- 표준 라이브러리의 터미널 색상 출력도 확대
타입 시스템과 C 확장 지원
- TypedDict, PEP 728은 선언하지 않은 추가 키를 금지하거나, 추가 키의 값 타입을 지정 가능
- TypeForm, PEP 747은 int, str | None, list[int]처럼 타입 표현식 자체를 인자로 받는 API에 정확한 타입 어노테이션 제공
- 서로 배타적인 기반 클래스, PEP 800는 함께 상속할 수 없는 클래스 관계를 타입 검사기에 표현하는 기능
자유 스레딩 빌드용 안정 ABI
- abi3t, PEP 803/820/793는 자유 스레딩 빌드에서도 버전 간 호환 가능한 C 확장 바이너리를 만들기 위한 안정 ABI
- 사용하려면 확장 모듈의 소스 수정이 필요할 수 있으며, 기존 확장이 자동으로 호환되는 것은 아님
- PyBytesWriter, PEP 782로 C 코드에서 Python 바이트 객체를 생성하는 API 추가
- 인터프리터 종료 보호, PEP 788로 종료 중인 인터프리터 접근에서 발생하는 스레드 멈춤과 충돌을 방지하는 API 추가
macOS 27.0의 IDLE/tkinter 주의사항
- IDLE이나 tkinter 기반 앱에서 대화상자를 여는 메뉴 명령을 실행하면 앱이 멈출 수 있음
- IDLE의 About IDLE, Settings, Open Module 등이 해당하며, 강제 종료가 필요할 수 있음
- macOS 27.0의 운영체제 동작 변경이 원인으로, 현재 모든 Tk 버전과 이에 의존하는 현행 Python 버전에 영향을 주는 것으로 추정됨
- Tk 기반 앱에 의존한다면 해결책이 나올 때까지 macOS 업그레이드를 미루거나, 실제 작업 흐름이 영향을 받는지 먼저 테스트할 것을 권장
- 진행 상황은 이슈 #158053에서 확인 가능
새 기능을 게임으로 체험
- whatsnewt는 Python 3.15의 새 기능을 사용하는 터미널 텍스트 어드벤처 게임
- 인터프리터 내부의 Startup Foyer에서 Release Gate로 향하며 18개 퍼즐을 해결
- 단순 퀴즈가 아니라 Python 3.15에서 실제 코드를 작성하고 실행하며, 타입 검사 퍼즐은 pyrefly로 검증
- uvx --python 3.15 whatsnewt로 실행 가능하며, 이스터에그도 포함
- 자세한 변경 사항은 Python 3.15의 새 기능과 전체 변경 기록에서 확인 가능
키워드
Python 3.15.0JIT자유 스레딩