Python 언어는 컴파일이 아닌 인터프리터 언어로 구분이 된다. 그렇다면 컴파일은 무엇이고, 인터프리터는 뭐란 말인가?
그렇다면, 인터프리터 언어는 어떻게 작동할까?
인터프리터 언어는 어떻게 작동하냐에 따라 CPython과 PyPy 방식이 등장한다. PyPy라는 말은 코딩 테스트할 때 기본 파이썬보다 빠르다 정도로만 알고 있었을 것이다.
# CPython 사용법
$ python ex.py
# PyPy 사용법
$ pypy ex.py
자 먼저, 기본적인 파이썬의 동작방식(CPython)을 알아보자.
CPython은 기본적으로 파이썬을 C언어로 구현한 방식으로.py
파일이 .pyc
파일(바이트코드)로 컴파일된 후, Python Virtual Machine에서 구동된다.
반면, PyPy는 파이썬을 파이썬으로 구현한 방식이다. 또한, JIT (Just-In-Time)컴파일러를 사용하여 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식으로 연산시간을 대폭 감소시켰다.
이것만 보면, "응? 그럼 python대신 PyPy를 쓰면 되는거 아니야?"라고 생각이 들 수 있지만 그렇지가 않다. PyPy의 가장 치명적인 단점은 Numpy와 같은 C를 내부구현으로 사용한 라이브러리에는 오히려 느려지고 에러가 발생할 수 있다는 것이다.
자, 이제 우리는 파이썬의 동작방식을 알았다.
요약하자면, 기본 파이썬 인터프리터인 CPython은 파이썬을 C언어로 구현해 바이트코드로 컴파일 후 가상머신으로 구동시키는 방식이다. 그렇다면 여기서 성능 개선의 여지가 생긴다.
Cython은 아예 파이썬 코드를 컴파일해 import 할 수 있는 C 확장 라이브러리를 만들어 속도를 향상시키는 방식이다.
Numba는 ypy와 마찬가지로 JIT Compiler를 이용해 속도를 향상시키는 방식이다. Pypy와 달리 사용을 위해 코드의 수정이 필요하지만 기본적으로 @jit 라는 데코레이터만 함수 위에 써주면 작동하므로 쉽게 사용 가능하다.