분명 동일한 파이썬 언어인데 코딩 테스트 사이트를 보면 Python으로 해석하는 게 있고 “PyPy“로 돌리는 게 있습니다. 둘의 차이가 무엇인지 궁금즘이 생겨 공부하게 되었습니다.
다재다능한 프로그래밍 언어인 Python은 단순성과 가독성으로 수많은 애플리케이션을 지원하죠. 그러나 프로젝트 규모가 커짐에 따라 성능 개선의 필요성이 생겨나게 되었습니다.
이에 따라 등장 한 것이 Python용 동적 언어 컴파일러인 “PyPy” 입니다.
PyPy란?
PyPy는 Python 언어의 대체 구현입니다.
표준 CPython 인터프리터와 달리 PyPy는 성능을 높이기 위해 JIT(Just-In-Time) 컴파일러를 활용하여 Python 자체로 작성되었습니다.
JIT 컴파일
기존 Python 인터프리터는 AOT(Ahead-Of-Time) 컴파일 접근 방식을 사용하여 코드를 한 줄씩 해석합니다.
반면 PyPy는 실행 직전에 Python 코드를 기계어 코드로 변환하는 JIT 컴파일을 사용합니다.
이 동적 컴파일 프로세스는 실행 속도를 향상시킵니다.
성능 향상
PyPy의 주요 동기 중 하나는 CPython의 GIL(Global Interpreter Lock)을 극복하는 것입니다.
PyPy의 JIT 컴파일은 더 나은 병렬성을 허용하여 특히 CPU 바인딩 작업에서 성능을 향상시킵니다.
호환성
PyPy는 기존 Python 코드와의 호환성을 목표로 합니다. 대부분의 Python 프로그램은 수정 없이 PyPy에서 실행되어야 합니다.
이 호환성은 성능 개선을 원하는 프로젝트의 마이그레이션을 단순화합니다.
JIT 컴파일을 더 궁금하다면
Dynamic Translation
JIT 컴파일은 기존 컴파일처럼 프로그램의 소스 코드를 미리 기계어 코드로 변환하지 않는 프로세스입니다.
대신, 프로그램이 실행되기 직전인 런타임 중에 변환이 동적으로 발생합니다.
JIT 컴파일 프로세스
소스 코드 로드
- 프로그램이 실행되기 시작하면 소스 코드가 메모리에 로드됩니다.
Intermediate Representation (IR)
- 소스 코드는 intermediate representation으로 변환되며, 종종 바이트코드 또는 플랫폼별 중간 언어 형태로 변환됩니다.
프로파일링 및 최적화
- 실행 전 JIT 컴파일러는 프로그램의 동작을 분석하고 프로파일링을 통해 자주 실행되는 코드 경로를 식별합니다.
Selective Compilation
- JIT 컴파일러는 자주 실행되거나 “hot” 코드 경로를 선택적으로 기계어 코드로 변환합니다.
- 실행을 위해 코드의 필수 부분만 번역되므로 성능 향상이 발휘되는 곳입니다.
번역된 코드 실행
- 번역된 기계어 코드는 메모리에 저장되어 실행됩니다.
- 후속 프로그램 실행에서는 사전 번역된 기계어 코드를 활용하여 재번역이 필요하지 않도록 할 수 있습니다.
CPython과의 차이점
JIT Compilation vs. CPython’s Interpretation
PyPy의 JIT 컴파일은 CPython의 Interpretation과 대조됩니다.
PyPy는 런타임 중에 Python 코드를 기계어 코드로 동적으로 변환하는 반면, 기존 파이썬 interpretor인 CPython는 코드를 한 줄씩 해석합니다.
GIL 및 Concurrency
CPython의 전역 인터프리터 잠금(Global Interpreter Lock)은 여러 스레드의 동시 실행을 제한합니다.
JIT 컴파일과 결합된 PyPy의 접근 방식은 GIL의 영향을 완화하여 애플리케이션의 동시성을 향상시킵니다.
성능 특성
PyPy는 특히 계산 작업이나 긴밀한 루프와 관련된 시나리오에서 CPython보다 성능이 뛰어난 경향이 있습니다.
동적 최적화 기능은 보다 효율적인 실행에 기여합니다.
아래 공식 홈페이지의 성능 벤치마크 결과를 보면 CPython의 번역보다 대부분 빠른 실행시간을 나타내는 것을 확인 할 수 있습니다.
메모리 사용량
PyPy는 더 나은 성능을 보일 수 있지만 CPython에 비해 메모리 공간이 약간 더 높을 수 있습니다.
이러한 절충안은 프로젝트의 특정 요구 사항을 기반으로 고려해야 합니다.
PyPy 사용법
기존 Python 인터프리터와 함께 PyPy를 설치하는 것부터 시작하세요. 최신 버전은 PyPy 공식 홈페이지에서 다운로드할 수 있습니다.
pip install pypy3
인터프리터를 PyPy로 지정하여 Python 스크립트를 실행합니다.
pypy3 your_script.py
PyPy 사용시 유의사항
패키지 호환성
PyPy는 광범위한 Python 패키지와 모듈을 지원하지만 CPython의 고유한 기능에 특별히 최적화되거나 종속되는 일부 패키지가 있을 수 있습니다.
공식 홈페이지의 그림만 보더라도 bm_mdp, sphinx 패키지의 경우 그냥 파이썬 인터프리터로 돌리는 게 더 빠르다는 것을 확인 할 수 있습니다.
중요한 종속성의 호환성을 확인하는 것이 좋습니다.
C Extensions
일부 Python 패키지에는 CPython 인터프리터용으로 특별히 컴파일된 C 확장이 포함되어 있습니다.
PyPy에는 C 확장을 처리하기 위한 자체 메커니즘이 있지만 특정 확장이 완전히 호환되지 않는 경우가 있을 수 있습니다.
테스트 및 검증
프로젝트에 PyPy를 완전히 채택하기 전에 코드를 철저하게 테스트하는 것이 중요합니다.
특히 코드가 특정 기능이나 종속성에 의존하는 경우 더욱 그렇습니다.
자동화된 테스트 도구와 프레임워크는 잠재적인 호환성 문제를 식별하는 데 도움이 될 수 있습니다.