NEW in Python 3.15: Explicit Lazy Imports
Video

NEW in Python 3.15: Explicit Lazy Imports

2026.03.11
·YouTube·by 이호민
#Lazy Imports#PEP#Performance#Python

핵심 포인트

  • 1PEP 810의 lazy import는 Python 3.15에 도입될 기능으로, 모듈 로딩을 실제 사용 시점까지 지연시켜 프로그램 시작 시간과 메모리 사용량을 절감합니다.
  • 2이 기능은 `lazy import module` 또는 `lazy from module import name` 구문을 사용하며, 첫 사용 시점에 모듈이 로드(reification)되고 이후에는 일반 import와 동일하게 동작하여 추가 오버헤드가 없습니다.
  • 3lazy import는 모듈 레벨에서만 허용되며, import 에러가 실제 사용 시점으로 지연되고, `lazy_modules` 기능을 통해 이전 Python 버전과의 호환성을 유지할 수 있습니다.

이 문서는 PEP 810에 명시된 Python의 "명시적 지연 임포트(explicit lazy imports)"에 대해 설명합니다. 이는 Python 3.15에서 도입될 예정인 기능으로, 프로그램의 시작 시간(startup time)과 메모리 사용량을 줄이는 것을 목표로 합니다.

핵심 개념 및 동작 방식:

기존의 일반적인 임포트(import json 등)는 해당 모듈을 즉시 로드하고 실행합니다. 반면, 지연 임포트(lazy import)는 임포트된 이름이 실제로 사용될 때까지 모듈 로딩을 지연시킵니다. 예를 들어, lazy import json 구문은 json 모듈을 당장 로드하지 않고, 코드에서 json.dumps()와 같이 json 객체를 처음 사용할 때 비로소 로드됩니다.

문법:

  • 모듈 전체를 지연 임포트할 때: lazyimport<modulename>lazy import <module_name>
  • 특정 이름만 지연 임포트할 때: lazyfrom<modulename>import<name1>,<name2>lazy from <module_name> import <name1>, <name2>

이때, 임포트 구문이 실행되는 시점에 바인딩은 즉시 생성되지만, 실제 모듈이나 이름은 첫 접근 시에 로드(reification)됩니다. 첫 사용 이후에는 일반 임포트와 동일하게 동작하며 추가적인 오버헤드는 없습니다.

재실체화(Reification):

지연된 이름이 처음 사용될 때, Python은 그 순간에 일반적인 임포트 메커니즘을 실행합니다. sys.path, sys.meta_path 등 임포트 상태는 지연 임포트문이 작성된 시점이 아닌, 재실체화가 발생하는 시점의 상태를 따릅니다. 재실체화 후에는 해당 바인딩이 일반 임포트와 구별할 수 없게 되며, 인터프리터는 바이트코드를 최적화하여 이후 접근 시 오버헤드를 제로화할 수 있습니다. resolve() 메서드를 호출하여 참조를 가진 경우 명시적으로 재실체화를 강제할 수 있습니다. globals() 호출이나 모듈의 __dict__에 접근하는 것은 재실체화를 유발하지 않습니다.

오류 처리:

일반 임포트에서는 ImportError가 임포트 라인에서 발생하지만, 지연 임포트에서는 첫 사용 시점까지 오류가 지연됩니다. 디버깅을 위해 트레이스백(traceback)은 지연 임포트가 정의된 위치와 사용된 위치를 모두 표시합니다.

제한 사항:

  • lazy 키워드는 모듈 수준에서만 허용됩니다. 함수, 클래스 본문, try 블록 내부에서는 사용할 수 없습니다.
  • 스타 임포트(from X import *)는 지연될 수 없습니다.
  • from __future__ import 구문은 지연될 수 없습니다.
  • try...except 블록으로 지연 임포트를 감싸는 경우, ImportError가 사용 시점에 발생하므로 주의해야 합니다.

사용 사례 및 권장 사항:

  • 시작 시간 및 메모리 최적화: 특히 수많은 서브커맨드를 가진 커맨드 라인 도구에서 유용합니다. 실제 실행 경로에 필요한 모듈만 로드하여 자원을 절약합니다.
  • 타입 어노테이션(Type Annotations): lazy from typing import Any와 같이 사용하여 런타임 비용 없이 타입 힌트를 사용할 수 있습니다. 이는 많은 if TYPE_CHECKING: 블록을 대체할 수 있습니다.
  • 임포트 타임(Import Time) 부수 효과: 모듈이 임포트 시 자체 등록(예: 플러그인 레지스트리)을 하는 경우, 지연 임포트는 해당 등록이 첫 사용 시점에 발생하게 하여 로딩 순서를 변경할 수 있습니다. PEP에서는 이러한 경우 명시적인 발견(explicit discovery) 메커니즘(예: 임포트 및 등록을 수행하는 함수)을 권장합니다.
  • 이전 버전 호환성: Python 3.15 이전 버전을 지원해야 하는 경우, 모듈 수준 lazy_modules set을 활용할 수 있습니다. 이 set에 포함된 모듈은 3.15 이상에서 자동으로 지연 임포트처럼 처리되며, 이전 버전에서는 무시되어 즉시 임포트됩니다. 이를 통해 단일 코드베이스로 두 환경 모두를 지원할 수 있습니다.
  • 가시성 유지: 시작 시간 최적화를 위해 임포트를 함수 내부로 이동하는 대신, 지연 임포트를 사용하여 의존성을 모듈 수준에서 가시적으로 유지하면서도 로드를 지연시키는 것이 좋습니다.

결론적으로, PEP 810은 Python 애플리케이션의 성능을 향상시키기 위한 강력한 도구이며, 특히 모듈 로딩 비용이 큰 시나리오에서 효율적인 자원 관리를 가능하게 합니다.