Python 3.15가 2026년 10월 9일 출시됐다. 이번 버전은 지연 임포트, 불변 매핑형 frozendict, UTF-8 기본 인코딩, 새 프로파일러와 자유 스레드 빌드용 안정 ABI 등을 추가하고 표준 라이브러리와 C API를 폭넓게 바꿨다.

전체 변경 사항은 Python 3.15 변경 안내와 변경 기록에서 확인할 수 있다. 이전 버전에서 업그레이드할 때는 이식 안내를 참고해야 한다.

앱 시작과 텍스트 처리

PEP 810에 따라 lazy import와 lazy from ... import를 사용할 수 있다. 표시한 모듈은 이름을 처음 사용할 때 로드되므로, 많은 모듈을 가져오지만 실행마다 일부만 사용하는 프로그램에서 시작 시점의 로딩 부담을 줄이는 데 활용할 수 있다. 로드 실패 예외도 임포트 시점이 아니라 이름을 처음 사용할 때 발생한다. 지연 임포트는 모듈 최상위 범위에서만 허용되며, * 임포트와 future 임포트에는 적용할 수 없다. 전체 임포트를 지연하는 설정과 모듈별 필터도 제공한다. 자세한 내용은 지연 임포트 문서를 참조하면 된다.

인코딩을 지정하지 않은 입출력은 시스템 환경과 관계없이 UTF-8을 사용한다(PEP 686). 버전 간 호환성을 높이려면 코드에서 인코딩을 명시하는 것이 좋다. 영향을 받을 수 있는 코드는 인코딩 경고로 확인할 수 있으며, 이전 동작은 PYTHONUTF8=0 또는 -X utf8=0으로 유지할 수 있다.

언어·라이브러리 변경

새 내장형 frozendict는 생성 후 수정할 수 없고, 키와 값이 모두 해시 가능하면 자체도 해시할 수 있다. 순서는 삽입 순서를 보존하지만 비교에는 순서를 반영하지 않는다(PEP 814). 고유한 기본값 등을 표현하는 sentinel 내장형도 추가됐다(PEP 661). 리스트·집합·딕셔너리 컴프리헨션과 제너레이터 표현식에서는 *와 ** 언패킹을 지원한다(PEP 798).

표준 라이브러리에는 프로파일링 도구를 모은 profiling 패키지와 통계적 샘플링 프로파일러 Tachyon이 추가됐다(PEP 799). 실행 중인 프로세스에 연결하거나 프로그램을 처음부터 실행해 프로파일링할 수 있으며, CPU 시간·벽시계 시간 등 측정 모드와 여러 출력 형식을 제공한다. 기존 cProfile은 호환성을 위해 별칭으로 남지만, profile 모듈은 폐기 예정이며 Python 3.17에서 제거된다.

그 밖에 bytearray.take_bytes()는 바이트를 복사하지 않고 꺼내는 방법을 제공하고, 컴프리헨션의 언패킹과 함께 바이트 처리 코드를 정리할 때 활용할 수 있다. tomllib은 TOML 1.1.0을 지원하며, asyncio.TaskGroup.cancel()로 태스크 그룹을 일찍 종료할 수 있다. tarfile의 추출 필터와 심볼릭 링크 처리도 보안 관련 변경을 포함해 개선됐다.

성능 주장과 적용 조건

실험 단계인 JIT 컴파일러는 추적 프런트엔드와 레지스터 할당 등 여러 부분이 개선됐다. 문서에 인용된 pyperformance 결과에서는 최적화가 활성화된 표준 인터프리터와 비교해 x86-64 Linux에서 기하평균 7~8% 개선, AArch64 macOS에서 tail-calling 인터프리터 대비 11~12% 개선을 보고했다. JIT 빌드와 비JIT 빌드의 결과 범위는 x86-64 Linux와 AArch64 macOS에서 약 15% 느려지는 경우부터 100%가 넘게 빨라지는 경우까지다. 이는 특정 벤치마크와 플랫폼의 결과이며, 실제 프로그램의 성능 향상을 보장하지 않는다. JIT 빌드에는 LLVM 21이 필요하지만, JIT를 사용해 실행하는 일반 사용자에게 LLVM 설치가 필요한 것은 아니다.

CPython은 지원 플랫폼에서 기본적으로 프레임 포인터를 사용하도록 빌드된다(PEP 831). 자체 빌드 시스템으로 C·C++·Rust 확장 등을 컴파일하는 경우 해당 플래그를 이어받지 않으면 전체 스택 추적이 끊길 수 있어, 빌드 설정을 확인해야 한다. Windows 64비트 공식 바이너리에는 tail-calling 인터프리터가 적용됐다. 또한 자유 스레드 빌드용 Stable ABI인 abi3t가 도입됐지만, 기존 확장 코드를 그대로 사용할 수 있다는 뜻은 아니다. 전환에는 소스 변경이 필요할 수 있으며, 지원되지 않는 빌드 도구를 사용하면 cp315t 대상으로 별도 빌드해야 한다. 자세한 조건은 abi3t 이식 안내에서 확인할 수 있다.

업그레이드 전 확인할 점

open() 등에 인코딩을 지정하지 않은 코드의 동작이 달라질 수 있고, sqlite3 연결 함수의 데이터베이스 외 매개변수는 키워드 전용으로 바뀌었다. 폐기된 API도 제거됐다. 예를 들어 importlib의 load_module(), http.server의 CGI 지원, pathlib.PurePath.is_reserved()가 더는 제공되지 않는다. __cached__ 대신 __spec__.cached를 사용해야 하며, 기존 정규식 re.match()는 소프트 폐기 상태가 됐지만 제거 계획은 없다. 새 코드는 re.prefixmatch()를 우선 고려할 수 있다.

C 확장 개발자는 C API 변경도 확인해야 한다. 새 PyBytesWriter API가 추가됐고, 인터프리터 종료 중 스레드 상태를 다루는 보호 API도 도입됐다. 일부 오래된 함수와 매크로는 제거되거나 폐기됐다. 변경 목록과 교체 방법은 C API 변경 안내에서 확인할 수 있다.