백준에서 문제를 풀 때 Python 언어를 선택하는 경우 Python3과 pypy3가 있다. 이 두 언어의 차이점은 무엇일까? 차이점을 알아보기 전에 컴파일러 언어와 인터프리터 언어가 무엇이고 이 둘의 차이점은 무엇인지 명확히 알아가야 한다.
개발자가 작성한 소스코드를 모두 기계어로 변환한 후 기계(JVM 같은 가상머신)에 넣고 기계어 코드를 실행한다. 소스코드를 기계어로 컴파일하는 과정에서는 인터프리터 언어에 비해 시간이 소요되지만, 런타임 상황에서는 이미 기계어로 모든 소스코드가 변환되어 있기 때문에 빠르게 실행될 수 있다.
한줄씩 읽고 바로 명령어를 실행하는 언어이다. 런타임 상황에서는 한 줄씩 실시간으로 읽어서 실행하기 때문에 컴파일 언어에 비해 속도가 느리다. 실행속도는 느리지만 코드 변경시 빌드 과정없이 바로 실행이 가능하다는 장점이 존재한다.
📌 차이점
실행 단계의 차이
컴파일 언어는 '컴파일러' 단계가 필요하고 인터프리터 언어는 별도의 컴파일러 과정이 필요하지 않다.
생산속도의 차이
컴파일 언어는 '컴파일' 과정이 들어가기 때문에 인터프리터 언어보다 생산속도가 느리다. 인터프리터 언어는 과정이 단순하기 때문에 생산속도가 빠르다.
실행속도의 차이
실행속도는 컴파일 언어가 더 빠르다. 컴파일을 한 뒤 생성된 파일에 대해 프로그램이 실행되기 때문에 실시간으로 읽고 수행되는 인터프리터 언어에 비해 훨씬 빠르다.
Python과 C로 구성된 언어로 구현체가 CPython이다. 즉, Python3는 인터프리터이면서 컴파일러 언어이다. 개발자가 작성한 python code를 컴파일하여 bytecode로 바꾸고 인터프리터가 실행한다.
Python3 언어와 문법은 같지만 JIT(Just-In Time) 컴파일 방식을 도입한 것이다. JIT 컴파일이란 프로그램을 실행하기 전에 컴파일 하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일 하는 방식이다. 자주 쓰이는 코드를 캐싱하는 기능이 있기 때문에 인터프린터 언어의 느린 실행속도를 개선할 수 있다.
결과적으로, 간단한 코드 상에서는 Python3가 메모리, 속도 측에서 우세하고 복잡한 코드를 사용하는 경우에는 PyPy3가 우세하다. 강승현님의 몸소 겪었던 Python과 Pypy의 차이에서 실제 백준 문제에서 느꼈던 차이점을 포스팅하였으니 읽기를 추천한다.
=========== 2021.12.07 update
백준 1062번 가르침 문제를 채점할 때에도 같은 코드임에도 불구하고 Python으로 제출할 경우 시간초과로 실패하였다. 하지만, PyPy3로 제출했을 경우 852ms초로 무사히 통과할 수 있었다. 브루트포스 문제이므로 한 번 풀어보길 바란다!