[잡다한 궁금증] Python은 인터프리터 언어인데 컴파일을 한다고?

2026. 3. 11. 14:58잡다한 궁금증

오늘부로 신설 코너를 하나 개설했습니다 ㅎㅎ

 

바로 제가 그때 그때 생기는 잡다한 여러 분야의 궁금증을 해결하기 위해 리서치 하여 글로 남기는 잡다한 궁금증 코너입니다.

 

신설 코너도 잘 부탁드립니다 흐흐흫

 

오늘의 궁금증은 최근에 있었던 전공 강의로 파이썬 기초를 듣는 과정에서 발생했습니다.

 

요즘 수업을 들으면서 제 기존 지식과 정면으로 충돌해 머릿속에 물음표를 띄운 이슈가 하나 있었는데요.

 

바로

 

"Python 인터프리터가 코드를 실행하는 과정에서 일부가 컴파일된다"

 

라는 교수님의 설명이었습니다.

 

생각해 보니, 저는 Python이 소스 코드를 바이트 코드로 바꾼 뒤 무조건 1줄씩 순차적으로 통역하는 아주 정직한 방식만 고수한다고 굳게 믿고 있었더라고요.

 

"어떻게 1줄씩 번역하는 인터프리터 언어에서 컴파일이 일어난다는 거지?"

 

수업이 끝난 후 이 찝찝함을 참지 못하고 파헤쳐 본 가벼운 리서치 결과, 제 오해를 바로 잡아준 Python의 숨겨진 최적화 기법인

 

JIT 컴파일에 대해 공유해 봅니다.

1. 1줄씩 해석하는 방식은 생각보다 무겁다.

Python 은 코드를 바이트 코드로 변환해 한 줄씩 통역하며 실행합니다.

 

Java와 같이 OS를 타지 않는 유연한 방식이죠.

 

하지만 수만 번 반복되는 루프문 안에서 매번 똑같은 통역 연산을 수행한다면 비효율의 끝판왕이 될 겁니다.

 

그래서 파이썬 생태계는 이 끔찍한 연산량을 줄이면서도 유연함을 유지할 수 있는 똑똑한 우회로를 찾았습니다.

2. 반복되면 번역하고, 아니면 통역해라

제가 리서치를 통해 알아낸 이 최적화 기술, JIT 컴파일의 목표는 단 하나입니다.

 

무거운 실시간 통역 연산을 최대한 안 쓰는 것이죠.

 

파이썬 코드가 실행될 때, 뒤에서 조용히 실행 패턴을 감시하다가 엄청나게 반복되는 Hot Code 구간을 발견하면 전략을 바꿉니다.

  • 상황 A (반복이 적은 코드): 몇 번 실행되지 않는 함수라면, 기존처럼 인터프리터가 한 줄씩 통역하며 지나갑니다.                  이땐 컴파일을 하는 오버헤드가 더 크기 때문입니다.
  • 상황 B (핫 코드 발견): 특정 루프나 함수가 미친 듯이 반복되면, 그 순간 통역을 멈추고 해당 구간 전체를 CPU가 바로 읽을 수 있는 '기계어'로 한 번에 컴파일해 버립니다.

프로그램 실행 시간의 80% 이상은 핵심 반복문 20%에서 발생하니까요.

 

이 구조를 통해 실행 속도를 눈에 띄게 끌어올리게 됩니다.

 

근데 가만히 생각해 보면, 이 방식은 운영체제에서 가상 메모리를 관리할 때 사용하는 OS의 캐시와 그 원리가 완벽하게 똑같습니다.

 

운영체제가 엄청나게 느린 보조기억장치에서 데이터를 퍼오는 불상사인 페이지 폴트를 막기 위해,

 

한 번 읽어온 데이터를 속도가 빠른 메인 메모리의 페이지 캐시에 쟁여두고 바로바로 꺼내 쓰잖아요?

 

파이썬도 마찬가지입니다.

 

매번 바이트 코드를 한 줄씩 해석하는 느린 통역 과정을 피하기 위해,

 

한 번 번역해 둔 기계어를 메모리에 쟁여두고 꺼내 쓰는 것이죠.

 

하드웨어든 소프트웨어든 느린 병목 작업을 피하기 위해 결과물을 빠른 공간에 미리 모아둔다는

 

컴퓨터 공학의 캐싱 철학을 그대로 따르고 있는 셈입니다.

 

그래서 파이썬이 번역된 기계어를 저장해 두는 이 임시 공간의 공식 명칭도 코드 캐시라네요.

3. 리서치 과정에서 얻은 소소한 팁

사실 오랫동안 기본 CPython에는 이 기능이 없어서 파이썬은 무조건 느리다는 편견이 있었습니다.

 

속도를 내려면 PyPy 같은 대안을 써야만 했죠.

 

하지만 최신 파이썬 3.13 버전부터는 공식적으로 이 동적 컴파일 기능이 도입되기 시작했다고 합니다.

 

'1줄씩 통역한다'는 단편적인 고정관념에서 벗어나,

 

내부적으로 성능을 끌어올리기 위한 파이썬의 치열한 최적화 방식을 알게 된 유익한 리서치였습니다.

 

긴 글 읽어주셔서 감사합니다!