카테고리: 파이썬 (Python)

파이썬 3.15 rc1 출시! lazy import 확정 - 베타4에서 달라진 점 총정리 🐍

목차10개 항목

안녕하세요! Mojangcam입니다 😎

지난달에 파이썬 3.15 새 기능 정리 - lazy import·frozendict·UTF-8 기본값 (베타 4 기준) 글에서 3.15의 핵심 기능을 미리 정리해드렸는데요. 드디어 2026년 8월 4일, 파이썬 3.15.0rc1(릴리스 후보 1) 이 공개됐어요!

"베타 때 배운 거 정식 나오면 바뀌는 거 아니야?" 하고 불안하셨던 분들, 오늘 그 걱정을 끝내드릴게요. 이번 글에서는 rc(릴리스 후보)가 무슨 의미인지, 베타4에서 뭐가 달라졌는지, 그리고 지난 글에서 지면상 못 다뤘던 확정 기능들(lazy import 필터 API·Tachyon 프로파일러·JIT 성능 수치) 까지 한 번에 정리합니다. 디스코드 봇이나 자동화 스크립트 돌리시는 분들에게 특히 와닿는 내용이 많아요!

📌 RC(릴리스 후보)가 뭐길래 "확정"이라고 하나요? 🗓️

먼저 일정부터 업데이트할게요.

  • 베타 4 (마지막 베타): 2026-07-18 ✅
  • RC 1: 2026-08-04 ✅ ← 지금 여기!
  • RC 2: 2026-09-01
  • 정식 출시: 2026-10-01 예정

rc 단계부터는 규칙이 확 달라져요. 공식 발표 기준으로 핵심을 추리면 이래요.

하나씩 뜯어볼게요 💡

  • 버그 수정만 허용 : rc1부터 정식 출시까지는 리뷰를 거친 명백한 버그 수정만 들어갈 수 있어요. 기능이 추가되거나 빠지는 일은 이제 없다는 뜻이에요.
  • ABI 동결 : 3.15 시리즈에서 더 이상 ABI(바이너리 호환성) 변경이 없어요. 그래서 rc1 기준으로 빌드한 확장 모듈·휠(wheel)은 앞으로 나올 모든 3.15 버전에서 그대로 동작합니다.
  • 생태계 준비 시작 : 그래서 파이썬 팀이 라이브러리 관리자들에게 "지금부터 3.15용 휠을 PyPI에 올려달라"고 공식 요청했어요. 정식 출시 전에 numpy·pandas 같은 주요 라이브러리가 하나둘 3.15를 지원하기 시작하는 시기가 바로 지금이에요.

즉, 베타가 "바뀔 수도 있는 미리보기"였다면 rc는 사실상 완성본이에요. 지금 공부해두면 10월 정식 출시 때 그대로 써먹을 수 있습니다 🙌

📌 베타4 → rc1, 그래서 뭐가 달라졌나요?

결론부터 말씀드리면 — 기능 목록은 그대로, 대신 이제 '확정'입니다.

새 기능 추가가 멈추는 기능 동결(feature freeze)은 이미 베타 1(2026-05-07) 때 지나갔기 때문에, 베타4 → rc1 사이에는 버그 수정과 안정화 작업만 있었어요. 지난 글에서 정리한 lazy import(PEP 810), frozendict(PEP 814), UTF-8 기본 인코딩(PEP 686) 은 문법과 동작 모두 설명드린 그대로 정식 버전에 들어갑니다.

공식 하이라이트 목록에 오른 확정 기능을 한눈에 보면 이래요.

  • lazy import (PEP 810) — 시작 속도 개선의 주인공
  • frozendict / sentinel 내장 타입 (PEP 814 / PEP 661)
  • profiling 패키지 + Tachyon 샘플링 프로파일러 (PEP 799)
  • 컴프리헨션 언패킹 (PEP 798), UTF-8 기본값 (PEP 686), 에러 메시지 개선
  • JIT 성능 향상 8~13%, 프레임 포인터 기본 활성화(PEP 831) 등 성능·관측성 개선

그래서 오늘은 복습 대신, 지난 글에서 못 다룬 확정 세부 기능을 파볼게요. 특히 lazy import의 필터 API와 Tachyon 프로파일러는 이번에 처음 소개하는 내용이에요!

📌 lazy import 확정 - 필터로 골라서 지연시키기 🚀

문법 복습은 세 줄이면 충분해요. lazy 소프트 키워드를 import 앞에 붙이면, 모듈을 처음 사용하는 순간에 로딩해요. 모듈 최상단에서만 쓸 수 있고, 구버전 호환이 필요하면 __lazy_modules__ 리스트를 쓰면 됩니다. 자세한 기초는 지난 베타4 글을 참고해주세요.

Python
lazy import json          # 이 시점엔 로딩 안 함
data = json.loads('{}')   # ← 여기서 진짜 로딩!

오늘의 새 내용은 전역 lazy 모드를 켰을 때 "어떤 모듈만 지연시킬지" 고르는 필터예요. sys.set_lazy_imports_filter() 에 함수를 등록하면 됩니다.

Python
import sys

def myapp_filter(importing, imported, fromlist):
    # 내 앱 모듈만 lazy로, 나머지(서드파티)는 즉시 로딩
    return imported.startswith("myapp.")

sys.set_lazy_imports_filter(myapp_filter)
sys.set_lazy_imports("all")

import myapp.slow_module  # lazy (필터 통과)
import json               # 즉시 로딩 (필터에서 False)

하나씩 뜯어볼게요 💡

  • importing : import를 하는 쪽 모듈 이름이에요 (없으면 None).
  • imported : import 대상 모듈 이름이에요. 위 예제는 이름이 myapp. 으로 시작할 때만 True 를 돌려줘요.
  • fromlist : from x import y 의 y 목록이에요. 일반 import x 면 None 이 들어와요.
  • 반환값 : True 면 "지연 허용", False면 강제로 즉시 로딩이에요. 전역 모드("all")를 켜도 서드파티 라이브러리는 안전하게 즉시 로딩하고 싶을 때 딱이에요.
  • types.LazyImportType : 어떤 이름이 아직 로딩 전 프록시인지 코드로 판별해야 할 때 쓰는 타입도 추가됐어요. 라이브러리 제작자용에 가까우니 "이런 게 있다" 정도만 알아두세요.

지연 로딩 시 모듈에 오류가 있으면 첫 사용 시점에 예외가 나는데, 트레이스백에 사용 위치와 import 위치가 둘 다 찍힐는 것도 그대로 확정이에요. 디버깅 걱정은 덜어도 됩니다!

📌 Tachyon 프로파일러 - 돌아가는 프로그램에 그대로 붙어요 🔥

"내 봇이 갑자기 느려졌는데 어디가 문제지?" 싶을 때 쓰는 도구가 프로파일러예요. 3.15에서는 프로파일링 도구가 profiling 패키지로 싹 정리됐어요 (PEP 799).

  • profiling.tracing : 기존 cProfile이 이사 온 거예요. 모든 함수 호출을 기록하는 방식이라 정확하지만 느려요. (cProfile 이름도 당분간 그대로 동작해요. 단, 순수 파이썬판 profile 모듈은 deprecated — 3.17에서 삭제 예정!)
  • profiling.sampling : 이번에 새로 들어온 샘플링 프로파일러 Tachyon이에요. 오늘의 주인공!

Tachyon이 특별한 이유는 실행 중인 프로세스에 코드 수정·재시작 없이 붙을 수 있다는 거예요. 주기적으로 스택을 찍는 샘플링 방식이라 오버헤드가 거의 0에 가깝고, 샘플링 속도는 최대 1,000,000Hz(초당 백만 번) 까지 나와요. 운영 중인 서비스가 느려졌을 때 그대로 들여다볼 수 있다는 뜻이죠.

터미널
# ① 스크립트를 처음부터 프로파일링 → 브라우저용 플레임그래프(HTML) 생성
python3.15 -m profiling.sampling run --flamegraph my_bot.py

# ② 이미 돌아가는 프로세스(PID 12345)에 붙어서 실시간 TUI로 보기
python3.15 -m profiling.sampling attach --live 12345

# ③ 멈춘 것 같은 프로세스의 스택을 한 방에 찍기 (행 걸린 원인 찾기)
python3.15 -m profiling.sampling dump 12345

하나씩 뜯어볼게요 💡

  • run / attach / dump : 새로 실행하며 측정(run), 돌아가는 프로세스에 접속(attach), 지금 이 순간의 스택 스냅샷(dump) — 상황별로 골라 쓰면 돼요. 모듈 실행은 run -m 모듈명 형태예요.
  • --flamegraph : 결과를 혼자서도 열리는 HTML 플레임그래프로 저장해줘요. 그래프에서 가로로 넓은 함수 = 시간을 많이 먹는 함수라서, 병목이 눈에 바로 보여요.
  • --live : top 명령어처럼 실시간으로 갱신되는 화면에서 정렬·필터링하며 볼 수 있어요.
  • --mode : 기본은 실제 흐른 시간(wall)이고, CPU 연산만 보려면 cpu, 멀티스레드에서 GIL 점유를 보려면 gil 모드도 있어요.
  • 다른 출력 형식 : --pstats(표 형태), --collapsed(플레임그래프 외부 도구용), --gecko(Firefox Profiler용), --heatmap(소스 줄 단위 히트맵)도 지원해요. async 코드는 --async-aware 옵션으로 코루틴 단위 분석까지 돼요.

📌 숫자로 확정된 성능 개선 - JIT·플랫폼 변화 ⚡

rc1 공식 발표에서 성능 관련 수치도 확정돼서 나완어요. 코드를 안 고쳐도 받는 혜택들이에요.

  • JIT 컴파일러 대폭 업그레이드 : x86-64 리눅스에서 일반 인터프리터 대비 8~9%, AArch64 macOS(애플 실리콘)에서는 테일콜 인터프리터 대비 12~13% 빨라졌어요.
  • 윌도우 공식 배포판 변화 : 윌도우 64비트 공식 바이너리가 테일콜(tail-calling) 인터프리터를 쓰도록 바뀌었어요. python.org에서 받기만 하면 적용돼요.
  • macOS 공식 배포판 변화 : macOS 설치 파일에 프리스레딩(free-threading, GIL 없는 빌드) 지원이 기본 포함돼요.
  • 프레임 포인터 기본 활성화 (PEP 831) : perf 같은 시스템 프로파일러·디버거가 파이썬 프로세스의 네이티브 스택을 더 빠르고 정확하게 추적할 수 있게 됐어요. Tachyon과 함께 "관측 가능성"이 3.15의 숨은 테마예요.

🛠️ rc1 설치해서 직접 확인해보기

베타 때와 똑같이 기존 파이썬은 그대로 두고, rc1을 별도 설치 + 가상환경으로 돌리는 게 안전해요.

  • 파이썬 3.15.0rc1 — python.org 다운로드 페이지의 Pre-releases 항목에서 받을 수 있어요
  • 기존 파이썬 3.13 / 3.14 — 지우지 마세요!
  • 가상환경(venv) — rc도 프리뷰 버전이라 운영 환경 사용은 아직 비권장이에요
터미널
# 설치 확인
python3.15 --version
# Python 3.15.0rc1
# (윈도우라면) py -3.15 --version

# 가상환경 만들고 활성화
python3.15 -m venv venv315
source venv315/bin/activate      # 윈도우: venv315\Scripts\activate

가상환경이 처음이라면 이 글부터 보고 오세요 👉 파이썬 가상환경(venv) 완벽 정리

📌 전체 코드 (복붙 OK)

rc1이 잘 설치됐는지, 확정 기능이 그대로 도는지 한 번에 확인하는 스크립트예요.

Python
# Python 3.15.0rc1 기준 (정식 출시 2026-10-01 예정)
# 파일명: py315_rc1_check.py
# 실행:  python3.15 py315_rc1_check.py

# lazy import - rc1에서 문법 확정! 첫 사용 때 로딩돼요
lazy import json

import sys

def check_version():
    print("[1] 내 파이썬 버전")
    print("  버전      ->", sys.version.split()[0])
    print("  lazy 모드 ->", sys.get_lazy_imports())

def check_lazy():
    print("\n[2] lazy import - rc1에서도 그대로")
    print("  json 로드됨? ->", "json" in sys.modules)
    data = json.loads('{"release": "rc1", "final": "2026-10-01"}')  # ← 여기서 로딩!
    print("  json 로드됨? ->", "json" in sys.modules)
    print("  파싱 결과   ->", data)

def check_frozendict():
    print("\n[3] frozendict - 내장 타입 확정")
    cfg = frozendict(version="3.15.0rc1", release="2026-10-01")
    print("  값 읽기 ->", cfg["version"])
    try:
        cfg["version"] = "3.16"
    except TypeError as e:
        print("  수정 시도 ->", e)

if __name__ == "__main__":
    check_version()
    check_lazy()
    check_frozendict()

📌 실행 결과

텍스트
[1] 내 파이썬 버전
  버전      -> 3.15.0rc1
  lazy 모드 -> normal

[2] lazy import - rc1에서도 그대로
  json 로드됨? -> False
  json 로드됨? -> True
  파싱 결과   -> {'release': 'rc1', 'final': '2026-10-01'}

[3] frozendict - 내장 타입 확정
  값 읽기 -> 3.15.0rc1
  수정 시도 -> 'frozendict' object does not support item assignment

json 로드됨? -> False 가 먼저 나오고, loads() 를 부른 뒤에야 True 로 바뀌는 것 — 베타4 글에서 봤던 그 동작 그대로죠? 이 모습 그대로 10월 정식 버전에 들어갑니다 🎉

📌 자주 나는 에러

1. pip install 하다가 빌드 에러가 나요

  • 원인: 설치하려는 라이브러리가 아직 3.15용 휠(wheel)을 안 올린 경우예요. pip가 소스 빌드를 시도하다 실패하는 거죠. rc 시기에 아주 흔한 일이에요.
  • 해결: 정식 출시(10월) 전후로 주요 라이브러리 휠이 올라오니 조금 기다리거나, 실제 작업은 3.13/3.14 환경에서 계속 하세요. rc1은 "내 코드 미리 점검용"으로만!

2. python3.15: command not found (윈도우: 인식 안 됨)

  • 원인: PATH에 안 잡혔거나 설치가 안 된 경우예요.
  • 해결: 윈도우는 py -3.15 런처를 쓰는 게 제일 간단해요. macOS/리눅스는 설치 경로 확인 후 다시 시도하세요.

3. SyntaxError — lazy import 줄에서 터져요

  • 원인: 그 파일을 파이썬 3.14 이하로 실행했어요. lazy 는 3.15부터 생긴 문법이에요.
  • 해결: python --version 부터 확인하세요. 구버전도 지원해야 하는 코드라면 lazy 키워드 대신 __lazy_modules__ = ["json"] 방식을 쓰면 3.14 이하에서도 에러 없이 돌아가요.

4. 필터를 등록했는데 lazy가 안 되는 것 같아요

  • 원인: sys.set_lazy_imports_filter() 는 "지연을 허용할지"만 정해요. 소스에 lazy 키워드가 없다면 전역 모드를 sys.set_lazy_imports("all") 로 켜야 지연 대상이 돼요. 그리고 이미 로딩된 모듈은 소급 적용되지 않아요.
  • 해결: 필터 등록 → 모드 설정 → import 순서인지 확인하세요.

📌 마무리

오늘 내용 요약이에요! 💬

  • rc1 출시(8/4) = 기능·ABI 동결. 지금 배우는 3.15 문법은 정식 버전에서 그대로 써요.
  • lazy import 확정 + 전역 모드에서 골라 지연시키는 sys.set_lazy_imports_filter() 까지 알아뒀어요.
  • Tachyon 프로파일러 — 돌아가는 프로세스에 그대로 붙어서 플레임그래프·실시간 TUI로 병목을 찾아줘요.
  • JIT 8~13% 향상, 윈도우 테일콜 인터프리터, macOS 프리스레딩 기본 포함까지 성능 소식도 확정!

다음 일정은 rc2가 9월 1일, 정식 출시가 10월 1일 예정이에요. 정식이 나오면 그때 또 최종판으로 정리해드릴게요.

다음 편은 파이썬 pandas 실전 - 엑셀 데이터 분석으로 찾아옵니다! 지난 pandas 입문 편에서 배운 걸로 진짜 엑셀 데이터를 분석해볼 거예요. 기대해주세요! 🙌

궁금한 점이나 rc1에서 겪은 문제가 있다면 댓글로 남겨주세요 💬

글쓴이

Mojangcam

직접 코드를 짜고, 서버를 돌리고, 막힌 에러를 해결하며 배운 것들을 기록하는 개발·IT 실전 기록 블로그