엔지니어링 블로그

Python 3.15: 성능과 개발 경험의 조화 (주요 변화 총정리)

Python 3.15: 성능과 개발 경험의 조화 (주요 변화 총정리)

Python 3.15

https://docs.python.org/3.15/whatsnew/3.15.html

파이썬 3.15의 알파 단계가 마무리되면서 구체적인 스펙들이 공개되었습니다. 이번 릴리즈는 성능(Lazy Import + JIT + Profiler), 개발자 경험(에러 메시지, Typing), 그리고 시스템 기능(SSL, Subprocess) 강화에 초점이 맞춰져 있습니다.

주요 하이라이트를 상세히 정리해 보았습니다.


🚀 Summary – Release Highlights

  • PEP 810 (Lazy Imports): import 시점이 아니라 실제 사용 시 로딩하여 startup 성능 대폭 개선
  • PEP 814 (frozendict): Immutable + Hashable dict 타입 드디어 추가
  • PEP 799 (profiling 패키지): 프로파일링 기능을 통합한 새로운 모듈 구조
  • Tachyon Profiler: 초고속 샘플링 프로파일러 추가 (Production 사용 가능)
  • PEP 798 (Comprehension Unpacking): 리스트/딕셔너리 컴프리헨션에서 *, ** 지원
  • UTF-8 기본 인코딩: OS와 무관하게 시스템 전체에서 UTF-8 기본 사용
  • 타입 시스템 개선: TypedDict 확장 및 TypeForm 도입
  • JIT 업그레이드: 지속적인 성능 개선
  • 에러 메시지 개선: 더 정확하고 친절한 Suggestion 제공

1. PEP 810: Explicit Lazy Imports

그동안 대규모 프로젝트의 고질병이었던 startup 속도를 해결하기 위한 기능입니다.

  • lazy import 키워드를 사용하여 모듈 임포트를 실제 접근 시점까지 지연시킵니다.
  • 접근 전까지는 Proxy 객체로 유지됩니다.
  • 기존 코드 구조를 유지하면서도 초기 로드 시간을 획기적으로 줄일 수 있습니다.
  • CLI 옵션, 환경 변수, 또는 Runtime API를 통해 전역적으로 제어할 수 있으며, 필터 함수를 사용해 선택적으로 적용하는 것도 가능합니다.
  • 단, module-level에서만 사용 가능하다는 제약이 있습니다.

2. PEP 814: frozendict

드디어 파이썬에 변경 불가능한(Immutable) 딕셔너리가 도입됩니다.

  • 이 객체는 Immutable이자 Hashable하므로, 다른 딕셔너리의 Key로 사용하거나 Set의 원소로 넣을 수 있습니다.
  • 순서는 유지하지만, 비교 연산 시에는 순서를 무시합니다.
  • 여러 표준 라이브러리(stdlib) 모듈에서도 공식 지원이 추가되었습니다.
  • 이제 dict 타입 체크 대신 Mapping 기반의 체크가 권장됩니다.

3. PEP 799: profiling 패키지 & Tachyon

프로파일링 도구들이 profiling이라는 새로운 네임스페이스 아래로 통합됩니다.

  • 기존 cProfiletracing으로 이동하며, 새로운 샘플링 프로파일러인 Tachyon이 추가됩니다.
  • 기존 profile 모듈은 향후 deprecated될 예정입니다.

⚡ Tachyon (Sampling Profiler)

  • 최대 1MHz의 초고속 샘플링 기반 프로파일러입니다.
  • Zero Overhead에 가까워 서비스 운영 중(Production)에도 사용 가능합니다.
  • 실행 중인 프로세스에 즉시 attach 할 수 있습니다.
  • 지원 모드: Wall / CPU / GIL / Exception
  • 다양한 출력: Flamegraph, Heatmap, pstats 등
  • Async, Thread, Opcode 레벨의 분석을 모두 지원합니다.

4. PEP 798: Unpacking in Comprehensions

컴프리헨션의 문법적 제약이 완화됩니다.

  • 리스트/셋/딕셔너리 컴프리헨션 내에서 ***를 사용할 수 있습니다.
  • 복잡한 중첩 루프(Nested Loop)를 대체하거나, itertools.chain 없이도 리스트를 평탄화(Flatten)할 때 유리합니다.
  • Async Generator에서도 동일하게 동작합니다.

5. 에러 메시지 및 언어적 변화

  • 에러 메시지 개선: AttributeError 발생 시 내부 객체 경로까지 추적하여 더 정확한 제안을 제공합니다. delattr 관련 오류에도 유사한 개선이 적용되었습니다.
  • UTF-8 기본 설정: 윈도우를 포함한 모든 환경에서 UTF-8이 기본 인코딩이 됩니다.
  • Regex 지원: warnings 필터에서 정규표현식을 사용할 수 있습니다.
  • 기타: bytearray.take_bytes()(Zero-copy 반환), 슬라이스(Slice) 제네릭 타입 지원, math.integer 모듈 신설 등이 포함되었습니다.

6. 표준 라이브러리(Stdlib) 주요 개선 사항

  • argparse: Typo Suggestion 기능이 기본 활성화됩니다.
  • collections.Counter: XOR(^) 연산이 추가되었습니다.
  • json: array_hook이 추가되어 Immutable한 구조로 즉시 파싱이 가능해졌습니다.
  • re: 더 명확한 API인 prefixmatch가 추가되었습니다.
  • shutil/tarfile: 보안 취약점(Path Traversal 등)에 대한 대응이 강화되었습니다.
  • sqlite3 CLI: 자동완성과 컬러 출력이 지원됩니다.
  • subprocess: Event-driven 방식의 wait이 도입되었습니다.

Join the Investigation

Get the latest updates on my projects and indie hacking journey directly in your inbox.

No spam. Unsubscribe anytime.