8P by neo 4달전 | favorite | 댓글 1개

Python 3.13에 JIT 컴파일러 추가

  • CPython 코어 개발자 Brandt Bucher가 Python 3.13 브랜치에 JIT 컴파일러를 추가하는 풀 리퀘스트를 제출함.
  • 이 변경사항은 Python 3.11에 추가된 특수화 적응 인터프리터 이후 CPython 인터프리터에 가장 큰 변화 중 하나가 될 것임.

JIT란 무엇인가?

  • JIT(Just in Time) 컴파일은 코드가 처음 실행될 때 컴파일이 이루어지는 설계를 의미함.
  • JIT 컴파일러는 기계 코드를 생성하는 컴파일러를 말하며, AOT(Ahead of Time) 컴파일러와 대조됨.
  • Python 코드는 먼저 바이트코드로 컴파일되며, 이 바이트코드는 CPU에게 아무 의미가 없고 특수한 바이트코드 인터프리터 루프를 통해 실행됨.

copy-and-patch JIT란 무엇인가?

  • copy-and-patch JIT는 2021년에 제안된 개념으로, 동적 언어 런타임을 위한 빠른 알고리즘으로 설계됨.
  • copy-and-patch JIT는 각 명령어에 대한 지시사항을 복사하고 바이트코드 인수를 채우는(패치하는) 아이디어임.

copy-and-patch JIT의 장단점

  • "전체" JIT 컴파일러는 고수준 바이트코드를 중간 언어(IL)의 저수준 지시사항으로 컴파일하는 반면, copy-and-patch JIT는 바이트코드에서 기계 코드로 컴파일하는 것을 템플릿의 집합으로 수행함.
  • copy-and-patch JIT는 복잡한 JIT 컴파일러 아키텍처를 Python 런타임 내에서 실행할 필요가 없으며, LLVM JIT 도구를 소스에서 CPython을 컴파일하는 기계에 설치하기만 하면 됨.

이 JIT는 어떻게 작동하는가?

  • Python 3.13의 API에 새롭게 추가된 API를 확장하여 플러그 가능한 최적화기가 런타임에 발견될 수 있도록 함.
  • 새로운 JIT는 이 새로운 아키텍처를 위한 선택적 최적화기임.
  • 소스에서 CPython을 컴파일할 때 --enable-experimental-jit 플래그를 제공하면 Python 바이트코드에 대한 기계 코드 템플릿이 생성됨.

이 JIT가 더 빠른가?

  • 초기 벤치마크는 약 2-9%의 성능 향상을 보여줌.
  • 이 JIT는 Python의 성능을 크게 향상시킬 수 있는 일련의 최적화의 초석임.

GN⁺의 의견

  • Python 3.13에 추가된 JIT 컴파일러는 Python 실행 속도를 향상시키는 중요한 변화로, 특히 반복적인 작업에 대한 효율성을 높일 수 있음.
  • copy-and-patch JIT는 복잡한 JIT 아키텍처를 사용자의 Python 런타임에 통합할 필요 없이 성능을 향상시키는 혁신적인 접근법을 제공함.
  • 이 기술은 Python 커뮤니티에게 흥미로운 논의를 제공하며, Python의 성능 최적화에 대한 새로운 문을 열 것으로 기대됨.
Hacker News 의견
  • 소프트웨어 버전 간의 2-9% 성능 향상이 흥미로움. 이러한 작은 개선들이 실망스럽게 여겨지기도 하지만, 지속적으로 누적되어 각 버전이 이전보다 빨라짐을 선호함.
  • Haoran Xu와 Fredrik Kjolstad의 '복사 및 패치' 기법이 주목받고 있음이 멋짐. Xu의 LuaJIT 리메이크 프로젝트 블로그 포스트를 통해 처음 접함. 기존 기술을 재활용하여 새로운 것을 창조하는 방식이 매우 영리함으로 느껴짐. 해당 블로그 포스트는 언어 구현에 대해 배우고 싶은 사람들에게 추천됨. 또한, Xu가 블로그 업데이트가 늦어진 이유가 뒷단의 재작업 때문임을 밝힘.
  • Brandt가 작년 CPython 코어 개발자 스프린트에서 이 주제에 대해 발표함.
  • PyPy, Jython, GraalPy, IronPython의 작업에도 불구하고, CPython에 JIT이 추가되는 것은 Python 생태계에 중요한 발전으로 여겨짐. 특히 3.13 버전 이후의 진화가 기대됨.
  • Python을 웹 개발 외 모든 것에 사용하는데, 성능이 향상된다면 매우 긍정적임. Python 생태계가 CGI나 mod_php와 같은 무상태 요청에서 벗어나 장기 실행 프로세스로 이동했음. 이는 로컬 웹 애플리케이션을 변경할 때마다 재시작해야 한다는 의미인지, 일부 개발자들은 파일 저장 시 애플리케이션을 자동으로 재시작하는 방법을 사용하고 있음.
  • CPython은 코드베이스를 매우 단순하게 유지하고, 다른 구현체에서 최적화를 담당하기로 되어 있었음을 기억함.
  • 기사에서는 '복사 및 패치' JIT를 새로운 것으로 소개하지만, DOS의 QuickBASIC이 비슷한 방식을 사용했음을 기억함. QuickBASIC은 메모리 내에서 템플릿 어셈블리 블록을 패치하여 매우 나쁜 어셈블리 코드를 생성했음.
  • 지난 2년간 Python 성능에 대한 진전이 놀라움. 코어 팀이 성능 향상을 진지한 목표로 삼고 눈에 띄는 개선을 이룸.
  • PyPy에 자금을 투자하기를 바람. 하지만 PyPy는 작은 프로그램에서는 빠른 시작 시간이 그리 좋지 않아 큰 이점을 보지 못함. 또한 큰 프로그램에서는 복잡한 호환성 문제가 발생할 수 있음. 만약 CPython의 JIT가 더 신뢰성 있거나 빠른 시작 시간을 가진다면, 일부 문제를 해결할 수 있을 것임.
  • Python의 GitHub 리포지토리에 '크리스마스 전날 밤'을 패러디한 PR 메시지가 재치 있음.