가끔 "같은 프로그램을 Python 3 으로 제출하면 시간 초과를 받는데, Pypy3 으로 제출하면 맞았습니다를 받습니다. 왜 그런가요?" 같은 질문을 보게 됩니다.이 글에서는 이런 종류의 질문에 대한 답변을 해 보려고 합니다.
Python 3 은 언어 명세입니다. 프로그램의 문법을 정의하고, 각각의 문장이 가진 의미 (= 문장을 실행하면 달라지는 변화)를 정합니다.이렇게 Python 3 언어 명세를 정한 사람들은 그 언어 명세를 따르는 구현체 또한 제작하여 언어 명세와 같이 공개/배포합니다.
그 뒤, 몇몇 사람들은 배포된 Python 3 의 언어 명세를 이용하여 별도의 구현체를 만들기도 합니다.Pypy3 이나 IronPython, Jython 등이 여기에 해당합니다.
Python 3의 언어 명세를 만든 사람들이 같이 배포하는 구현체 또한 Python 3 이라고 부르는 것이 일반적입니다만,다른 구현체와 구분할 필요가 있을 때에는 CPython3 라는 이름을 사용하기도 합니다.CPython3 과 같이 언어 명세를 만든 사람이 같이 배포하는 구현체를 "참조구현" (Reference Implementation) 라고 부르기도 합니다.
즉, Python 3 (CPython3) 와 Pypy3 은 Python 3 의 언어 명세를 구현한 서로 다른 구현체입니다.GCC / clang / MSVC 가 C++ 언어 명세를 구현한 서로 다른 구현체인 것과 마찬가지입니다.
서로 다른 구현체인 CPython3 과 Pypy3 이 서로 다른 성능을 보이는 것은 어떻게 생각하면 매우 당연한 것입니다.GCC C++ 와 clang c++ 의 성능 차이가 별로 차이가 없는 것이 오히려 더 특이한 경우라고 생각되기도 합니다.
서로 다른 구현체인 만큼 각자 "잘하는" 분야와 "잘 못하는" 분야가 있을 수 있습니다.BOJ 와 같은 문제 풀이에서 많이 사용되는 프로그램들은 "대체로" Pypy3 가 유리하다고 알려져 있습니다만항상 100% 그럴 것이라고 생각해서는 안 됩니다.
아래는 CPython3 과 Pypy3 의 성능 비교 그래프입니다.각각의 벤치마크에서 CPython3 의 소요시간을 1.00 으로 표준화했을 때 Pypy3 의 소요시간을 나타낸 그래프로그래프 길이가 짧을수록 Pypy3 의 소요시간이 적습니다.
그래프를 보면, 대부분의 경우 Pypy3 의 소요시간이 적지만, 몇몇 벤치마크의 경우 오히려 CPython3 의 소요시간이 더 적은 것을 알 수 있습니다.BOJ 에서도 마찬가지로 Python 3 으로 제출한 프로그램이 Pypy3 보다 더 시간이 짧은 경우가 얼마든지 나올 수 있습니다.
댓글댓글 쓰기