PyPy 가 CPython 보다 빠른 이유
결론
결론부터 말하면, CPython 은 일반적인 인터프리터이지만 PyPy 는 실행 추적 JIT(Just In Time) 컴파일을 제공하는 인터프리터기 때문.
PyPy 는 RPython 으로 컴파일된 인터프리터인데,
C 로 작성된 RPython 툴체인으로 인터프리터 소스에 JIT 컴파일을 위한 힌트를 추가해 CPython 보다 빠른 실행 속도를 가질 수 있게 되었다.
탄생 계기
Psyco라고 하는, 기존 파이썬 위에다가 Just-In-Time 컴파일을 구현해서 실행성능을 높히는 프로젝트가 있었는데,
이걸 개발하던 Armin Rigo라는 사람이 아예 JIT 컴파일을 하는 파이썬을 처음부터 다시 구현하기로 생각했다.
접근법
-
먼저 RPython이라고 하는, 파이썬 문법을 엄격하게 만들어 컴파일이 되게 만든 해석기(translate.py)를 Python 코드로 작성한다.
-
RPython의 효과적인 컴파일을 위해 다른 언어로 툴체인을 만든다.
-
Python 구현(런타임)을 RPython 문법으로 작성한다.
-
3에서 만든 구현을 1 또는 2에서 만든 RPython 해석기로 컴파일한다.
-
4으로 만든 후보를 이전 또는 다른 구현과 비교(성능 측정), 만족스럽지 않으면 수정한다.(nightly builds)
-
5에서 만족스러운 결과를 냈다면 출시하고 1 또는 2부터 다시 시작한다.(release)
JIT
PyPy는 RPython으로 이루어진 Python 인터프리터와 (역시 RPython으로 이루어진)
C, .Net, JVM 등을 타게팅한 해석 툴체인으로 이루어져 있는데,
해석 툴체인은 해당 플랫폼을 위한 효율적인 코드를 생성하는 데 초점이 맞춰져 있으며,
Tracing JIT을 통해 인터프리터 단위의 JIT 컴파일이 가능하므로, CPython보다 빠른 결과물이 나오게 된다.
여기까지만이어도 그냥 기존 구현보다 그다지 느리지 않은 파이썬 구현을 다른 언어의 도움 없이 파이썬 스스로 만든 셈이지만,
여기서 하나가 더 들어간다. Armin Rigo가 뭐 만들던 사람이라는 내용이 위에도 있지만 PyPy는 JIT compiler이다.
그것도 그냥 JIT가 아니라 Meta tracing JIT라는 괴랄한 것을 구현했는데,
JIT이 필요한 부분에 약간의 힌트 코드를 넣으면 RPython 해석기가 알아서 JIT compile이 되는 언어 구현을 만들어준다.
다른 언어 구현들이 JIT 좀 해보자고 무지막지한 삽질을 하는 것과 달리 거의 공짜와 다름없다.
출처 : https://namu.wiki/w/PyPy
출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Python#pypy%EA%B0%80-cpython%EB%B3%B4%EB%8B%A4-%EB%B9%A0%EB%A5%B8-%EC%9D%B4%EC%9C%A0