Hello Python 3.15, goodbye 3.10, 그리고 이제 3.11을 사용할 수 있게 되다
요약
Python 3.15의 주요 업데이트 사항들을 소개하며, 명시적 지연 로딩(Explicit lazy imports)과 리스트 컴프리헨션에서의 언패킹 기능이 핵심입니다. 또한, 오버헤드가 적은 새로운 샘플링 프로파일러가 표준 라이브러리에 추가되어 성능 분석에 도움을 줍니다.
핵심 포인트
- 명시적 지연 로딩(PEP 810)으로 시작 비용 문제를 해결합니다.
- 리스트/셋/딕셔너리 컴프리헨션에서 언패킹 구문이 확장되었습니다 (PEP 798).
- 새로운 샘플링 프로파일러가 표준 라이브러리에 추가되어 성능 분석의 깊이를 더했습니다.
2026년 10월 12일
Python 3.15가 출시되었습니다! 여기는 3.14와 3.15 릴리스 매니저인 Hugo van Kemenade가 선별한 Python 3.15의 필수 What’s new 가이드입니다. 모든 지원되는 Python 버전에서 작동하는 오픈 소스 소프트웨어를 구축하는 사람으로서, 저는 Python 3.10에 작별을 고하고 Python 3.11의 기능을 받아들이기 시작할 수 있다는 점이 기쁩니다.
먼저, Python 3.15의 몇 가지 하이라이트를 살펴보겠습니다.
명시적 지연 로딩 (Explicit lazy imports)
저는 PEP 810에서 제안된 명시적 지연 로딩(Explicit lazy imports) 기능에 가장 기대가 큽니다. 이 기능을 사용하면 다음과 같이 모듈을 가져올 수 있습니다:
lazy import json lazy from pathlib import Path
이렇게 하면 해당 심볼이 이후 코드에서 처음 사용될 때 모듈이 임포트됩니다.
제가 만든 LLM CLI 도구는 플러그인을 구현합니다. 저는 플러그인 작성자 문서에 수동 지연 로딩을 권장해야 했는데, 그 이유는 sentence_transformers와 같은 무거운 종속성을 사용하는 플러그인을 단순히 설치하는 것만으로도 llm 명령어 호출마다 몇 초가 추가될 수 있기 때문입니다. 지연 로딩은 이러한 시작 비용(startup cost) 문제를 직접적으로 해결합니다.
리스트 컴프리헨션에서의 언패킹 (Unpacking in comprehensions)
새로운 [*sublist for sublist in lists] 언패킹 구문이 깔끔합니다. 문서에서 가져온 예시를 보여드리겠습니다:
lists = [[1, 2], [3, 4], [5]] [*L for L in lists] # [1, 2, 3, 4, 5] (이는 [x for L in lists for x in L]와 동일합니다.)
sets = [{1, 2}, {2, 3}, {3, 4}] {*s for s in sets} # {1, 2, 3, 4} (이는 {x for s in sets for x in s}와 동일합니다.)
dicts = [{'a': 1}, {'b': 2}, {'a': 3}] {**d for d in dicts} # {'a': 3, 'b': 2} (이는 {k: v for d in dicts for k,v in d.items()}와 동일합니다.)
PEP 798: Adam Hartz와 Erik Demaine이 제안했으며, 이는 PEP 448의 언패킹 구문을 확장한 것입니다. PEP 448은 2015년 Python 3.5에 도입되었습니다.
샘플링 프로파일러 (A sampling profiler)
Python의 기존 트레이싱 프로파일러는 cProfile에서 profiling.tracing으로 이름이 변경되었으며, Tachyon이라는 흥미로운 새로운 샘플링 프로파일러(aka profiling.sampling)가 추가되었습니다.
샘플링 프로파일러(Sampling profilers)는 실행 중인 프로세스에서 주기적으로 스택 트레이스(stack traces)를 캡처한 다음, 이를 사용하여 어떤 함수가 가장 많은 시간을 소비했는지 계산하는 방식으로 작동합니다. 이는 오버헤드가 매우 적으며, 시스템을 먼저 계측(instrument)할 필요 없이 실행 중인 시스템에 대한 깊은 통찰력을 제공할 수 있습니다.
저는 이전에 py-spy와 같은 도구를 사용해 왔습니다. 이제 이러한 기능이 표준 라이브러리에 내장되었습니다.
기존 Python 3.15 프로세스의 PID를 가지고 있다면, 다음 명령어를 실행하여 샘플을 수집하기 시작할 수 있습니다 (macOS에서는 sudo를 사용해야 했습니다):
sudo uv run --python 3.15 python -m profiling.sampling attach 1234
메인 프로그램과 상호 작용하다가 Ctrl+C를 눌러 수집을 중지하고 보고서를 확인하면 다음과 같은 형태입니다:

또한 이 도구는 다음과 같은 플레임 그래프(flame graphs)와 히트맵(heat maps)도 생성할 수 있으며, Firefox 프로파일러 UI에서 볼 수 있는 형식으로 출력하는 것도 가능합니다.
3.15가 3.14보다 훨씬 빠르지는 않다
Miguel Grinberg는 얼마 전 3.15.0rc3 릴리스와 비교하여 'Python 3.15는 얼마나 빠른가?'라는 주제로 조사했으며, 성능이 실험적인 JIT(Just-In-Time)를 제외하고는 대부분 3.14와 동일하다는 것을 발견했습니다. JIT 덕분에 표준 3.15 인터프리터 대비 (피보나치 테스트에서) 1.2배의 향상을 얻었으며, 이는 Miguel이 의미 있는 JIT 성능 향상을 관찰한 첫 사례였습니다.
Miguel은 작년에 3.14를 탐구하면서 여러 카테고리에서 Python 3.13 대비 상당한 향상을 발견했습니다.
uv를 사용하여 Python 3.15로 업그레이드하기
저는 Mac에서 uv가 Python 3.15를 사용하도록 하기 위해 다음 명령어 순서를 사용했습니다. 먼저, 새로운 릴리스에 대해 알 수 있도록 uv 자체를 업그레이드해야 했습니다:
uv self update
그런 다음 안정 버전인 3.15를 설치했습니다:
uv python install 3.15
그리고 프로젝트 자체가 다른 버전을 고정(pin)하지 않는 한, 모든 uv run 명령어에서 이것을 기본값으로 사용하도록 uv에 알려주었습니다:
uv python pin --global 3.15
이제 다음 명령어가 버전으로 3.15를 보고합니다:
uv run python --version
저는 이미 uv tool install을 사용하여 여러 도구들을 설치했습니다.
. 저는 다음과 같이 Python 3.15를 사용하기 위해 재설치했습니다:
uv tool upgrade datasette --python 3.15
그런 다음 다음과 같이 버전을 확인할 수 있습니다:
datasette --get /-/versions.json | jq
Python 3.11의 주요 변경 사항
3.15가 출시됨에 따라 Python 3.10(2021년 출시)은 공식적으로 더 이상 지원되지 않습니다.
저의 주요 오픈 소스 프로젝트 정책은 모든 지원되는 Python 버전에서 작동하도록 유지하는 것입니다. 이제 저는 3.10을 포기하고 3.11에서 도입된 기능을 사용하기 시작할 수 있습니다.
Python 3.11의 What’s new 문서를 참고하세요. 마침내 tomllib를 사용할 수 있게 되었습니다!
Datasette는 asyncio를 광범위하게 사용합니다.
. 3.11에서는 TaskGroup과 timeout() 등 여러 새로운 기능이 추가되었습니다.
datetime.UTC
은 3.11에서 datetime.timezone.utc의 새로운 별칭입니다.
.
Python의 SQLite 지원은 3.11에서 다음과 같은 중요한 업그레이드를 받았습니다:
- setlimit()과 getlimit()을 통해 Python에서 SQLite 런타임 제한을 설정하는 메커니즘이 노출되었습니다.
- create_window_function()을 사용하면
step(),
value(),
inverse(),
그리고finalize()메서드를 가진 클래스로 사용자 정의 윈도우 함수를 생성할 수 있습니다. -
blobopen()은 SQLite 행에 저장된 대용량BLOB바이너리 값의 부분 읽기 및 쓰기에 효율적인 메커니즘을 제공합니다. -
이제set_authorizer(None)를 호출하여 SQLite authorizer를 제거할 수 있습니다. Datasette는 이에 대한 임시 방편(workaround)이 있었습니다!
게다가 Python의 타입 시스템에 대한 수많은 개선 사항도 있습니다.
저는 향후 몇 주 동안 여러 프로젝트에 Python 3.11 개선 사항을 적용할 계획입니다. 여기에 set_authorizer(None) 임시 방편을 제거하는 첫 번째 Datasette PR이 있습니다.
또한 click-app, datasette-plugin, python-lib, llm-plugin cookiecutter 템플릿을 업데이트하여 Python 3.11부터 Python 3.15까지 테스트하도록 했습니다.
더 최근 기사
- 제 목소리로 구축된 블로그의 새로운 기능 - 2026년 10월 9일
- Claude Haiku 5.5 - 2026년 10월 7일
- 거의 모든 것에 기본 하드 예산 상한선이 필요할 것 같습니다 - 2026년 10월 3일
- OpenAI DevDay 2026 라이브 블로그 - 2026년 9월 29일
AI 자동 생성 콘텐츠
본 콘텐츠는 Simon Willison Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기