Huny's Dev Blog
huny.dev

Python 3.15 lazy import 사용법: 로딩 시점과 초기화 부작용 점검하기

Python 3.15의 명시적 지연 import로 모듈 로딩을 미루는 방법과 오류·초기화 순서·이전 버전 호환성 점검을 살펴본다.

Hun Jang
Hun Jang Nov 7, 2026

Python 3.15의 lazy import는 모듈을 선언한 시점이 아니라 가져온 이름을 처음 사용할 때 로딩한다. 여러 명령 중 일부만 실행하는 CLI처럼 실행 경로마다 필요한 모듈이 다른 프로그램에서 시작 시 불필요한 작업을 줄일 수 있다. 다만 오류와 초기화 부작용도 뒤로 이동하므로 기존 import를 일괄 변환하기 전에 실행 순서를 확인해야 한다.

필요할 때 열리는 모듈을 표현한 개념 일러스트다. 실제 실행 화면은 아니다.

기준일은 2026-11-07이다. 이 글의 코드는 공식 문서에 근거한 설명용 예제이며 Python 3.15 실행 환경에서 별도로 검증하지 않았다. Python 3.15 변경 사항과 PEP 810을 기준으로 한다.

선언과 실제 로딩을 분리한다

일반적인 import는 문장이 실행될 때 모듈을 불러온다. 명시적 지연 import는 이름에 지연 객체를 연결하고 그 이름을 처음 사용할 때 실제 import를 수행한다. 다음 예제는 두 파일을 같은 디렉터리에 둔다.

문서에 따른 예상 순서는 application ready, loading feature, running feature다. slow_feature.run()에 도달하지 않는 경로에서는 그 이름을 통한 로딩이 일어나지 않는다. 단, 다른 코드가 같은 모듈을 먼저 불러올 수 있으므로 지연 선언 하나만으로 프로세스 전체에서 미로딩을 보장하지 않는다. lazy from package import name도 사용할 수 있다. 공식 설명

오류와 초기화 시점이 바뀐다

모듈이 없거나 import 중 오류가 발생하면 선언 지점이 아니라 첫 사용 지점에서 예외가 생긴다. 시작 직후 의존성 문제를 발견하던 애플리케이션이라면 실제 기능 호출까지 실패가 숨겨질 수 있다. 배포 전 스모크 테스트는 각 기능을 실제로 호출해 지연된 import까지 실행해야 한다.

모듈 최상위 코드가 플러그인 등록, 로깅 설정 또는 레지스트리 변경을 수행하는 경우에도 그 작업이 첫 사용까지 미뤄진다. 다른 코드가 그 부작용에 의존한다면 일반 import를 유지하거나 초기화 함수를 명시적으로 호출한다. 로딩 순서 변화는 동작 변화이며 단순한 성능 옵션이 아니다. PEP 810 호환성

문법과 이전 버전의 경계

lazy 문법은 모듈 범위에서만 사용할 수 있다. 함수, 클래스 본문, try 블록 안이나 별표 import에는 사용할 수 없다. 그리고 Python 3.14 이하에서는 새 문법을 파싱할 수 없으므로 버전 조건문으로 감싸도 해당 파일을 읽는 단계에서 실패한다. 문법 제한

이전 버전을 함께 지원하는 코드에는 공식 문서가 설명하는 __lazy_modules__ 방식이 있다.

Python 3.15에서는 지정한 import가 지연되고, 이전 버전에서는 일반 import로 실행된다. 대상 모듈 이름과 패키지 구조를 공식 문서에 맞춰 확인하고, 지원하는 모든 버전에서 테스트한다. 지연 로딩 자체를 이전 버전에 추가하는 기능은 아니다.

적용 전 점검

  1. 먼저 실제 CLI의 시작 시간과 어떤 모듈이 로딩되는지 측정한다. import가 병목이 아닐 수도 있다.
  1. 자주 쓰지 않는 명령의 무거운 의존성부터 한 개씩 바꾼다. 공통 초기화나 등록 부작용이 있는 모듈은 먼저 의존 관계를 확인한다.
  1. 명령별 정상 경로와 누락된 의존성 경로를 실행한다. 오류가 발생하는 시점과 오류 메시지, 초기화 순서를 확인한다.
  1. 같은 환경에서 변경 전후 시작 시간과 첫 기능 호출 시간을 각각 측정한다. 비용이 사라지지 않고 첫 호출로 이동할 수 있으며, 이 글은 성능 개선 수치를 측정하지 않았다.
  1. Python 버전, 패키지 버전과 CI 테스트 범위를 기록한다. 전역 지연 모드보다 필요한 import를 명시하는 방식이 영향 범위를 파악하기 쉽다.

전역 옵션과 필터도 제공되지만 제3자 패키지의 초기화 순서까지 바꿀 수 있다. 먼저 명시적 선언으로 범위를 좁히고, 실제 배포 환경에서 검증한 뒤 적용한다. PEP 810 전역 제어

English version: Python 3.15 Lazy Imports: Loading Time, Side Effects, and CompatibilityPython 3.15 Lazy Imports: Loading Time, Side Effects, and Compatibility

추천 글