포스트

[Python] 3.13 버전 릴리즈 - GIL, JIT

Python 3.13

Python의 정식 넘버링 3.13 버전의 LTS가 지난 10월 7일 릴리즈 되었습니다!

17개월의 개발 기간을 가진 이번 3.13 버전은 작년과 마찬가지로 2024년 10월 7일에 공개되었습니다.

이번 3.13 버전은 매우매우 실험적이고 중대한 기술의 도입이 이루어졌습니다.

1. JIT 컴파일러의 실험적 도입

2. GIL을 해제한 free-threded 환경 도입

  1. 대화형 인터프리터 환경(REPL)의 사용성 증대

여기서도 가장 중요한 1번2번에 대해 조금 더 깊게 다뤄보도록 하겠습니다.

JIT 컴파일러의 실험적 도입

JIT(Just In Time) 컴파일러란, 인터프리터처럼 동작하지만 자주 사용되는 코드를 기계어로 컴파일하여 캐싱하는 방법을 통해 성능을 향상시킨 방식1)입니다.

인터프리터 방식은 파이썬이 다른 언어들에 비해 느린 여러 이유 중, 가장 큰 지분을 차지한다고 할 수 있습니다.

컴파일을 거치지 않으므로 프로그램의 수정과 실행 자체는 빠르게 할 수 있으나,

모든 동작에서 코드를 실시간으로 읽고 해석하기 때문입니다.

Java 또한 기본적으로 인터프리터 방식으로 동작하나,

자바 컴파일러가 바이트 코드를 만들어주고 이를 JIT 컴파일을 통해 기계어로 번역하여 실행하기 때문에

파이썬에 비해 훨씬 빠른 성능을 보여주는 것이죠.

이미 오래 전부터 JIT 컴파일을 통한 Python의 성능 향상은 시도된 바가 있었습니다만,

실험적으로라도 정식에 편입될 줄은 상상도 못했습니다.

이에 대해 가장 정확하고 자세한 정보를 확인하시려면

Python의 JIT 컴파일러에 대한 PEP-744 문서를 확인하시면 좋을 것 같습니다!

아직은 어디까지나 실험 단계

정식으로 편입되었다곤 하지만, 아직도 어디까지나 실험적 도입 단계임을 명심해야 합니다.

PEP-744 문서에서는, 프로덕션 환경에서는 절대 사용하지 마라고 못을 박아 두었습니다.

예기치 못한 문제가 발생할 수 있고, 다음 버전에서 다시 큰 변화가 생길 수 있기 때문입니다.

자세한 사용 방법은 저도 체험하고 다시 포스팅을 진행해보고자 합니다!

GIL 해제 실험적 도입

GIL(Global Interpreter Lock)은 멀티 코어(스레드) 환경에서도 하나의 스레드만 실행되도록 제한하는 상호 배제 락2)입니다.

파이썬이 느린 이유 2입니다.

GIL이 있어도 강제로 멀티 스레드 환경을 실행할 수는 있지만, 이는 병렬처리가 아닌 동시성 제어를 위한 기능입니다.

I/O가 발생했을 때, 스레드가 놀지 않고 다른 일을 하도록 만드는 것이죠.

즉, CPU 집약적 작업을 멀티 스레드로 처리할 수 없었습니다.

따라서 파이썬에서는 멀티 스레드가 아닌 멀티 프로세스 환경으로 병렬처리를 구현해야 합니다.

그러나 두 방식은 동작 원리나 구현 방식이 전혀 다릅니다.

또한 같은 수의 워커를 만드는 데에 멀티 프로세싱 환경이 더욱 많은 비용이 들기 때문에

보다 적은 리소스로 병렬 처리를 진행할 수 있는 멀티 스레딩 환경에 대한 아쉬움이 남아있던 것이죠.

Python의 초기 설계 철학으로 GIL이 존재하게 되었고,

시간이 지나며 코어와 GIL의 강결합으로 삭제가 매우 어려운 상태였으나,

많은 기여자들을 통해(무려 한국의 LINE 개발자 나동희 님에 대한 감사도 공식 문서에 있습니다!) 가능했다고 합니다.

앞으로는 GIL을 완전히 제거하고자 노력 중이라 합니다!

사용 방법은 똑같다!

앞서 말했듯, 원래 멀티 스레딩 자체는 기존 Python에서도 지원을 하고 있었기 때문에,

GIL을 해제한 버전의 Python 빌드를 사용하면,

진정한 멀티 스레딩 병렬 처리를 쓸 수 있게 됩니다!

요약하자면

GIL의 실험적 해제를 통한 병렬 처리 확장

JIT 컴파일의 실험적 도입을 통한 성능 확장

이 메인이 되는 매우 뜻 깊은 업데이트였습니다!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.