14P by neo 12일전 | favorite | 댓글 3개

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 모두 비록 지금은 미약할지 몰라도 파이썬의 흐름을 바꿀 매우 중요한 발전입니다. '가장 느린 언어'라는 오명을 벗어던지고 앞으로 더 많은 분야에서 활용될 파이썬의 미래가 기대됩니다.

Free threading(GIL 제거)의 중요성에 대에서는 PEP 703에서 다양한 사람들의 의견과 함께 잘 정리되어 있습니다.
또한 해당 PEP에 따르면 싱글 스레드에서 성능 하락은 5~6%에 불과하다고 하는데 해당 글과 일부 hn 댓글에서의 20~50%의 성능 하락이 있다는 주장은 납득하기 어렵네요. 확인할 수 있는 출처도 없고요.

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% 열정적이지 않은 사람들을 침묵시키고, 기대에 못 미치는 결과를 낸다는 주장
  • 놀라운 제목이라는 의견

  • 자동 병렬화에 대한 최근 작업 링크를 찾고 있다는 질문

    • 단일 스레드 코드를 작성하고 컴파일러가 멀티스레드 코드를 생성하는 방식에 대한 링크 제공