Skip to content
tutorials

Python의 3배 빠른 스타트업 트릭에는 함정이 있다

더 빠른 실행은 공짜 승리처럼 들리지만, 플러그인이 조용히 등록을 멈추면 문제가 발생합니다. Python의 새로운 접근 방식이 왜 게으름(laziness)을 명시적으로 만드는지에 대한 진짜 이야기입니다.

Dani Roth
Python의 3배 빠른 스타트업 트릭에는 함정이 있다

Python이 코드가 실행되기 전에 import 세금을 지불하는 이유

Python은 코드가 실행되기 전에 import 세금을 지불합니다. 인터프리터가 시작되면 eager-import 체인이 시작됩니다. 모듈을 찾고, 바이트코드를 컴파일하거나 로드한 다음, 모듈 수준의 코드를 실행합니다. 이 과정은 전체 의존성 그래프를 재귀적으로 거치며 모든 모듈과 그 의존성을 로드합니다.

이러한 eager loading은 대가를 치르게 합니다. 시작 속도가 중요한 애플리케이션, 명령줄 도구, 단기 실행되는 serverless 함수들이 이 비용을 가장 크게 체감합니다. 이들은 import한 것 중 많은 부분을 사용하기도 전에 종료될 수 있으며, 실행에 전혀 기여하지 않는 작업에 비용을 지불하게 됩니다. 한 Python 핵심 개발자가 작은 앱을 벤치마킹한 결과, 일반적인 import 시 시작에 104ms가 소요되었습니다.

Lazy loading은 탈출구를 제공합니다. 즉시 실행하는 대신, placeholder를 제공합니다. 파일 찾기, 바이트코드 컴파일, 모듈 수준 코드 실행과 같은 실제 import는 코드가 해당 모듈을 처음 참조할 때만 트리거됩니다. 이를 통해 작업이 필요할 때까지 지연시킵니다.

같은 개발자의 벤치마크는 그 영향을 보여줍니다. 무거운 import를 함수 내부로 숨기자 시작 시간이 46ms로 줄었습니다. 모든 import를 lazy하게 만들자 36ms로 더 줄어들어, eager loading보다 거의 3배 빨라졌습니다. 이는 보편적인 전체 런타임 개선이 아니라, 시작 속도에 최적화된 방식입니다.

새로운 lazy 키워드를 사용하는 명시적 lazy import는 플러그인 등록과 같이 모듈 수준의 부작용에 의존하는 기존 코드가 깨지는 것을 방지합니다. 이를 통해 의도치 않은 결과 없이 목표한 최적화를 보장합니다.

속도 향상 뒤에 숨겨진 작은 문법 변화

PEP 810은 명시적인 lazy imports라는 타겟팅된 문법 솔루션을 도입합니다. 일반 import처럼 파일 상단에 lazy import <module>을 배치하되, 코드가 import된 이름을 처음 액세스할 때까지 모듈 실행을 지연시킵니다. 이는 의존성을 눈에 보이게 유지하며, 느린 시작 속도를 해결하기 위해 코드베이스 전체에 import 문을 흩뿌려야 하는 일반적인 우회 방법을 피하게 해줍니다.

import를 함수 내부로 옮기는 익숙한 우회 방법은 의존성을 숨기고 코드를 복잡하게 만듭니다. 네이티브 lazy import는 이를 해결합니다. 가독성을 희생하거나 개발자가 import 위치를 강제로 리팩토링할 필요 없이 동일한 시작 속도 개선 효과를 제공합니다.

Python은 첫 사용 시 지연된 import를 해결합니다. 코드가 import된 이름이나 모듈 속성에 액세스할 때 인터프리터가 해당 모듈을 로드, 컴파일 및 실행합니다. 즉, 애플리케이션은 여전히 import 비용을 지불하지만, 런타임 중에 해당 특정 의존성이 실제로 필요할 때만 지불하게 됩니다.

이 타겟팅된 접근 방식은 상당한 이득을 제공합니다. 한 Python 핵심 개발자가 앱을 벤치마킹한 결과, 일반 import 시 104ms, 무거운 import를 함수 내부에 숨겼을 때 46ms, 모든 것을 lazy하게 했을 때 36ms가 소요되었습니다. 이는 eager 방식에서 완전히 lazy한 방식으로 전환했을 때 거의 3배의 속도 향상을 의미합니다. lazy 키워드를 사용하는 것이 PYTHONLAZYIMPORTS와 같은 전역 설정보다 선호되는데, 이는 import 중에 플러그인을 등록하거나 다른 중요한 부작용을 실행하는 코드가 깨지는 것을 방지하기 때문입니다. 가장 안전하고 큰 효과를 위해 무거운 import에만 사용하세요.

104ms의 시작 시간이 36ms로 줄어들지만, 이는 하나의 앱일 뿐입니다

한 Python 핵심 개발자가 작은 애플리케이션에서 lazy import의 영향을 시연했습니다. 일반적인 eager import를 사용한 기본 시작 시간은 104ms였습니다. 무거운 import를 수동으로 함수 내부로 옮기자 46ms로 줄었습니다. 명시적 lazy import를 사용하자 시작 시간은 36ms로 더 줄어들었습니다. 이는 eager 기본값 대비 2.9배의 속도 향상을 나타냅니다.

이 수치들은 잠재력을 보여주지만, 보편적인 보장을 의미하지는 않습니다. 성능 향상 폭은 애플리케이션마다 다릅니다. 귀하의 프로젝트를 직접 테스트하여 이점을 확인하십시오. 전체 사양 세부 정보는 PEP 810 – Explicit lazy imports를 참조하십시오.

Lazy imports는 startup-dominated workloads(시작 중심 워크로드)에서 가장 큰 효과를 발휘합니다. 여기에는 다음이 포함됩니다:

  • Command-line interfaces (CLIs)
  • 단기 로컬 스크립트
  • Serverless function invocations

이러한 시나리오에서는 초기 import 비용이 전체 실행 시간의 상당 부분을 차지하는 경우가 많습니다. 모듈 실행을 지연시키면 이러한 오버헤드가 직접적으로 감소합니다. 애플리케이션의 시작 시간을 측정하여 lazy imports가 유사한 성능 향상을 제공할 수 있는지 확인하십시오.

이 글이 마음에 드셨나요? 매일 아침 이런 글을 메일로 받아보세요.

하루 한 통 · 두 번의 클릭으로 구독 취소 · 제3자 추적 없음

모든 import를 lazy로 만드는 것이 역효과를 낼 수 있는 이유

Global lazy imports는 역효과를 낼 수 있습니다. 일부 모듈은 import 시점에 즉시 플러그인, 훅 또는 기타 동작을 등록하는데, 이를 지연시키면 설정이 예상대로 이루어지지 않습니다. 이러한 부작용에 의존하는 코드는 중단될 것입니다.

PEP 810과 같은 명시적 lazy import 구문은 이러한 위험을 방지합니다. 이는 특정 무거운 종속성이나 선택적 종속성을 대상으로 지연을 적용합니다. 이는 모든 import를 광범위하게 lazy로 변경하는 전역 환경 변수나 명령줄 스위치와는 다릅니다.

Meta의 Cinder Python 포크는 초기에 전역적인 지연 방식을 탐색했습니다. Cinder에서의 경험은 암시적 전역 lazy imports를 제안했던 PEP 690 작업의 기반이 되었으나, 바로 이러한 부작용 문제로 인해 거부되었습니다.

PEP 810의 명시적 접근 방식은 이러한 우려를 해결하며, 더 안전하고 통제된 메커니즘을 제공합니다. lazy import를 도입하기 전에 항상 Python 버전과 해당 기능의 구체적인 상태를 확인하십시오. 이는 상당한 시작 속도 향상을 제공하지만, 신중하고 타겟팅된 적용이 필요합니다.

자주 묻는 질문 (FAQ)

Python에서 lazy imports란 무엇인가요?

Lazy imports는 모듈이 처음 사용될 때까지 해당 모듈의 로딩 및 실행을 지연시킵니다.

Lazy imports를 사용하면 Python 시작 속도가 얼마나 빨라지나요?

한 소규모 앱 벤치마크 보고서에 따르면 시작 시간이 104ms에서 36ms로 약 2.9배 빨라졌습니다. 결과는 애플리케이션마다 다릅니다.

Lazy import는 어떻게 작성하나요?

명시적 형식인 lazy import module을 사용하여 해당 import가 필요할 때까지 지연시키십시오.

Lazy imports가 Python 애플리케이션을 중단시킬 수 있나요?

네. 플러그인을 등록하거나 import 시점에 부작용을 일으키는 모듈을 지연시키면 동작이 변경될 수 있습니다. 명시적이고 타겟팅된 사용은 이러한 위험을 줄여줍니다.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only

빌더를 위해

이 페이지는 지금 다른 사람의 도구를 위해 일하고 있습니다.

AI 에이전트가 읽고, 구매자가 도착합니다. 8개 언어와 MCP로 답합니다. 당신의 도구도 가질 수 있습니다 — 24시간 안에 공개.