GN⁺: Python 3.13에 대해 알아야할 모든 것 – JIT와 GIL의 향상
(drew.silcock.dev)Python 3.13의 주요 변경사항
- 2024년 10월 7일에 CPython v3.13.0이 출시될 예정임
- 이번 버전에서는 Python의 성능에 큰 영향을 미칠 수 있는 두 가지 주요 변경 사항이 포함됨
- Global Interpreter Lock(GIL)을 비활성화할 수 있는 "free-threaded" 버전
- 실험적인 Just-in-Time(JIT) 컴파일 지원
Global Interpreter Lock (GIL)
GIL이란?
- Python은 1980년대 후반 Guido Van Rossum에 의해 단일 스레드 인터프리터 언어로 설계 및 구현됨
- Python은 소스 코드를 바이트코드로 컴파일한 후, 인터프리터가 이를 실행함
- 객체를 모든 스레드에서 안전하게 액세스하기 위해 global lock(GIL)을 사용함
- 여러 스레드가 동시에 바이트코드를 실행하지 못하게 하는 전역 상호 배제 락임
- 공유 메모리 사용을 제한하지만 단일 스레드 성능에는 좋음
Python에 GIL이 있는 이유
- 1990년대 초반, 대부분의 프로그램은 단일 스레드였고, 단일 코어의 성능이 급격히 증가했음
- 다중 스레드 안전성을 위해 단일 스레드 성능을 희생할 필요가 없었음
- 다중 프로세스를 사용하여 여러 코어를 활용할 수 있음 (
multiprocessing
모듈)
왜 이제 GIL을 제거하는가?
- Python core 개발자들이 오랫동안 GIL 제거를 원했지만 단일 스레드 성능 저하 우려로 실행되지 못했음
- 최근 멀티코어가 보편화되면서 GIL로 인한 멀티스레딩 제약이 문제가 되고 있음
- Microsoft 후원으로 "Faster CPython" 프로젝트가 Python 성능 개선에 기여함
- Sam Gross가 GIL 없는 구현을 제안하여 PEP 703이 채택됨
- 단계적 도입 계획: 실험적 옵션 → 공식 지원 → 기본 모드
- 이러한 배경으로 점진적 GIL 제거 계획이 승인됨
성능은 어떤가?
- Free-threading을 활성화하면 20% 정도 단일 스레드 성능이 떨어짐
- GIL을 비활성화한 멀티스레딩은 상당한 성능 향상을 보임
- GIL을 활성화한 멀티스레딩은 단일 스레딩보다 느림
- GIL을 비활성화한 멀티스레딩은 멀티프로세싱과 비슷한 성능을 보임
Free-threading Python을 어떻게 사용하나?
- pyenv로 Python 3.13.0rc2t를 설치하면 free-threading 버전을 사용할 수 있음
- 기본값으로 GIL이 비활성화되며, '-X gil=1'로 런타임에 GIL을 다시 활성화할 수 있음
- GIL free를 지원하지 않는 모듈을 import하면 자동으로 GIL이 활성화됨
JIT (Just-in-Time) 컴파일러
JIT이란?
- 전통적인 ahead-of-time 컴파일과 달리, 실행 직전에 machine code를 생성하는 기법
- Python 3.13 이전에는 바이트코드를 하나씩 기계어로 변환하여 실행했음
- JIT 도입으로 바이트코드를 한 번에 기계어로 변환하고 필요 시 업데이트 가능
- Python 3.13에 도입된 기법은 "copy-and-patch" JIT으로, 미리 정의된 템플릿과 매칭되는 bytecode를 native code로 패치함
- 더 진보된 JIT 컴파일러는 코드가 자주 실행되는 "hot" 영역을 최적화할 수 있음
JIT가 미치는 영향은?
- 단기적으로는 Python 코드 작성이나 실행에 큰 변화는 없을 것임
- 그러나 점진적인 성능 개선이 이뤄져 다른 언어와 경쟁할 수 있을 것으로 기대됨
JIT를 어떻게 사용하나?
- Python 3.13에서 JIT는 실험적이며 기본으로 활성화되어 있지 않음
- 'PYTHON_CONFIGURE_OPTS="--enable-experimental-jit"' 옵션으로 빌드 시 활성화 가능
- 런타임에 'PYTHON_JIT=0/1'로 활성화 여부를 제어할 수 있음
결론
- Python 3.13은 runtime에 흥미로운 새로운 개념과 기능을 도입하는 큰 릴리스임
- GIL 제거와 JIT 도입으로 중요한 변화를 예고함
- 단기적으로는 큰 변화가 없겠지만, 장기적으로 Python 성능에 긍정적인 영향을 미칠 것임
- free-threading과 JIT가 성숙해지면서 특히 CPU 바운드 작업에서 성능에 큰 영향을 미칠 것으로 예상
GN⁺의 의견
- 이번 Python 3.13 업데이트는 Python 생태계에 큰 변화를 가져올 것으로 보임. GIL 제거로 멀티스레딩 병목 현상이 해소되고, JIT 도입으로 전반적인 실행 속도가 개선될 것으로 기대됨.
- 다만 이러한 변화가 완전히 안정화되기까지는 시간이 걸릴 것임. C extension 등 기존 패키지들의 호환성 문제가 발생할 수 있고, 멀티스레딩 프로그래밍 시 race condition 등 새로운 버그가 발생할 수 있음.
- Python의 느린 속도가 단점으로 지적되어 왔는데, 이번 업데이트로 이러한 인식이 개선되길 바람. 기존의 생산성과 가독성이라는 장점에 속도까지 갖춘다면 Python은 더욱 널리 사용되는 언어가 될 것임.
- 그럼에도 근본적으로 동적 타입 언어라는 한계는 있음. 정적 타입 언어의 장점을 가져오려는 노력도 계속 되어야 할 것임. 최근 Python에 도입된 type hinting과 Cython 등을 적극 활용하면 어느정도 해결할 수 있을 것으로 봄.
- 종합하면 Python 3.13은 흥미롭고 긍정적인 변화를 가져올 것으로 보임. 개발자들은 이번 변화를 잘 이해하고 활용해서 더 나은 Python 프로그램을 만들 수 있기를 기대함
GIL 제거 및 JIT 모두 비록 지금은 미약할지 몰라도 파이썬의 흐름을 바꿀 매우 중요한 발전입니다. '가장 느린 언어'라는 오명을 벗어던지고 앞으로 더 많은 분야에서 활용될 파이썬의 미래가 기대됩니다.
Hacker News 의견
-
GIL을 제거하면 일반적인 Python 프로그램이 느려지고 복잡성이 증가할 것이라는 의견
- 실제로 얻을 수 있는 이점에 대한 의문
- 여러 CPU 코어를 최대한 활용해야 하는 경우, OS가 프로그램의 여러 인스턴스를 실행하게 하여 병렬화 논리를 프로그램에 추가하는 방식 사용
-
JIT 활성화 버전을 다운로드할 수 없다는 점에 대한 불만
- 직접 Python 3.13 버전을 컴파일할 수 있지만, 많은 사람들이 시도하지 않고 피드백을 주지 않는다는 경험 공유
-
"Jack and Jill went up the hill"이라는 운율과 비슷하다는 의견
- "up the hill"이 무엇을 의미하는지 혼란스러웠음
- JIT를 출시했지만 GIL을 제거했는지에 대한 의문
-
짧게 실행되는 작은 메모리 프로그램에서 가비지 컬렉션을 끄면 속도가 크게 향상된다는 경험
- 이를 자동화할 수 있는지에 대한 궁금증
- 작은 프로그램이 메모리를 모두 사용하는 엣지 케이스에 대한 위험성 언급
-
2021년에 GIL 제거에 대한 첫 논의가 있었고, 그 당시 설명에 만족하지 못한 사람들에게 좋은 요약이라는 의견
-
GIL 없는 경우를 최적화하는 것이 정말 불가능한지에 대한 의문
- 20% 느려지는 것은 큰 문제라는 의견
-
릴리스 날짜가 10월 2일에서 10월 7일로 변경되었다는 소식
- 관련 링크 제공
-
nogil의 성능 저하가 20%로 인용되었지만, 최대 50%까지 될 수 있다는 의견
- JIT가 크게 도움이 되지 않는다는 점
- CPython의 사회적, 기업적 문제를 반영하는 실망스러운 릴리스라는 의견
- 몇몇 사람들이 기능을 약속하고, 100% 열정적이지 않은 사람들을 침묵시키고, 기대에 못 미치는 결과를 낸다는 주장
-
놀라운 제목이라는 의견
-
자동 병렬화에 대한 최근 작업 링크를 찾고 있다는 질문
- 단일 스레드 코드를 작성하고 컴파일러가 멀티스레드 코드를 생성하는 방식에 대한 링크 제공