“파이썬 속도 향상”··· 피스톤(Pyston), 개발 재개
조회 18,804 · 공감 6 · 댓글 10
오랫동안 중단됐었던 ‘피스톤’ 개발 작업이 다시 시작됐다. 지난 28일(현지 시각) 드롭박스가 후원을 중단한 이후 처음으로 피스톤 개발팀이 피스톤 2.0을 출시한 것이다. 피스톤은 파이썬 프로그램의 실행 속도를 높이기 위해 JIT 컴파일(just-in-time compilation)을 사용하는 파이썬 런타임 변형이다.
기본적으로 피스톤은 표준 파이썬 런타임인 ‘C파이썬(CPython)’의 대체품을 제공한다. 또한 이는 파이썬 3.8과 호환되므로 해당 버전의 파이썬으로 실행되는 프로그램은 피스톤에서도 그대로 실행된다.
피스톤은 ‘JIT 컴파일’ 또는 ‘JITting’을 사용하여 코드를 생성해 속도를 크게 향상시킨다. 개발팀에 따르면 이는 표준 파이썬 프로그램에서 눈에 띄는 속도 개선을 보여줬다. 반면, ‘파이토치(Pytorch)’와 같이 더 빠른 실행을 위해 C/C++ 모듈을 사용하는 프로그램에서는 속도 향상이 적거나 거의 이뤄지지 않았다.
이 프로젝트의 목표 중 하나는 C파이썬의 원래 구현과 최대한 가깝게 유지하는 것이었다. 많은 서드파티 프로젝트가 C파이썬 동작(CPython behavior)에 대해 가정하기 때문이다. 이에 따라 ‘피스톤 2.0’은 기존 C파이썬 코드베이스에서 시작해, 피스톤 1.0에서 잘 작동했던 기능(예: 캐싱 속성 및 JITting)을 추가했다. 피스톤 JIT는 더 이상 LLVM(Low Level Virtual Machine)을 사용하지 않고, DynASM(Dynamic Assembler)을 사용하여 어셈블리를 직접 생성한다.
JITting은 파이썬 애플리케이션에 속도 향상을 지원하는 다른 프로젝트인 ‘PyPy’에서 사용하는 것과 동일한 기술이다. 이는 때에 따라 C파이썬이 제공할 수 있는 것의 7배에 이르기도 한다.
댓글 10
JIT 컴파일러는 자바에서 가상머신의 단점을 위해서 바이트코드를 변환하는 것으로 알고 있는데, 오로지 인터프리터 방식인 파이썬에서는 어떻게 동작하는건가요?? 파이썬도 자바처럼 바이트코드로 만들어 놓고, 다시 JIT 컴파일러를 사용하나요?
우선 파이썬, 자바스크립트 등 인터프리터 언어들은 거진 다 바이트코드를 쓰고 있다고 봐야합니다. 죄다 VM이라고 할 수 있죠.
인터프리터 언어는 기본적으로 런타임에서 (원본 코드) => (자체 바이트코드) => (기계어) 구조를 가지고, 자바는 원본 코드에서 이미 컴파일 해놨으니 런타임에서는 (바이트코드) => (기계어) 로 가는 것이고요.
파이썬의 (정확히는 CPython 이요. Pypy는 또 다른 바이트코드 쓸겁니다.) 바이트코드 명세에 대해서는 여길 참고하세요: https://docs.python.org/3/library/dis.html
파이썬 돌리다 보면 가끔 .pyc 파일이 생성되는데 그게 바이트코드입니다.
JIT이 없는 언어는 각 바이트코드를 순차적으로 읽어서 실행하는 것에 반해, JIT는 해당 바이트코드를 실행하기 전에 미리 해석해서 기계어로 변환해놓고 실행가능한 메모리에 저장하고, 그 저장된 기계어를 그대로 실행합니다.
안드로이드 기준으로 말씀드리면.. 버전업에 따라 컴파일러와 VM에 변화가 있어왔습니다.,
안드로이드는 현재 ART에서 AOT+JIT 컴파일러 방식으로 JIT 컴파일러도 레벨에 따라 최적화 정도를 구분하여 실행하고 있습니다.
AOT 컴파일러 - 미리 기계어로 번역된 코드 실행
JIT 컴파일러 (hot code) - 실행시점에 번역해 메모리에 올려 실행
인터프리터 (cold code) - 동적 실행
추가적으로 기존 정적 컴파일 vs AOT 차이는 소스 빌드시 기계어 번역 vs 설치되는 환경에서 기계어 번역 입니다.
정리하면, 인터프리터와 정적 컴파일러의 번역과 실행방식은 단순히 언어의 차이가 아닌 런타임에 따라 나뉜다고 할수 있습니다.
이렇게 런타임이 달라지면 해석하는 주체가 달라지므로 경우에 따라 다른 결과나 오류를 보일 수 있고 버전업 속도 등이 달라지게 됩니다.
ref: https://source.android.com/devices/tech/dalvik/jit-compiler?hl=ko