PyPy와 Python에 대해

띠용·2024년 3월 30일
0

Python 공부

목록 보기
2/2

왜 PyPy는 통과고 Python은 시간초과야?

백준 문제 풀다가 python으로 돌리면 시간이 터지는데 같은 코드를 pypy로 돌리니까 통과하는 문제가 있었다. 그래서 pypy가 뭔지 궁금해졌다.
애초에 python은 뭐지? 알아보자.

참고

https://velog.io/@happycyc/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%98-%EA%B5%AC%ED%98%84%EC%B2%B4

https://namu.wiki/w/Python/%EA%B5%AC%ED%98%84%EC%B2%B4

파이썬은 인터프리터?

파이썬 처음 배울 때 뭐 파이썬은 인터프리터 언어고, C는 컴파일러고 뭐고 하면서 둘의 차이를 비유로 설명들었던 기억이 난다. 잠깐 돌이켜보자,

중국인이 중국어로 한국인에게 말을 거는 상황을 가정하자.
어떻게 하면 한국인이 중국인의 말을 알아들을까?

  1. 파이썬은 실시간 통역이다. (interpreter)
    통역사가 실시간으로 중국인이 한 문장 말할때 마다 즉시 한국어로 통역한다.
  2. C는 다듣고 통역이다.(Compiler)
    통역사가 중국인의 말을 모두 듣고, 이해한 뒤에 한국어로 한번에 번역한다.

-> 그래서 파이썬은 컴파일 과정이 없어 생산속도는 빠르지만, 한줄한줄 읽고 실행해야 하기 때문에
실행속도는 이미 전부 기계코드로 변환된 것을 실행하기만 하면 되는 컴파일러(C)보다 느리다! 고 배웠다.

그런데 그런 파이썬은 C로 만들었다.

띠용? 파이썬도 C로 만들었네? 뭐야
그렇다. 파이썬은 사실 파이썬 코드를 전부 바이트 코드로 변환한 뒤에 바이트 코드를 한줄씩 해석하는 녀석이다. (뭐야?)
이 컴파일 과정을 보고도 파이썬 = 인터프리터 라고 하는 이유는 파이썬의 구현방식이 인터프리터 방식이기 때문이다.
(참조)

 즉, 파이썬의 소스코드가 바이트코드로 컴파일 과정이 일어난다 할지라도 
 이는 CPU에 의해 동작되는 것이 아닌 가상머신 위에서 동작되며
 사용자에게는 암시적으로 단순하게 .py라는 파일만 실행을 하기 때문에 인터프리터의 구현방식이라고 말을 할 수 있다.

바이트 코드 VS 바이너리 코드

바이너리 코드 -> CPU가 이해할 수 있는 이진 코드
ex)0101010....
바이트 코드 -> 가상머신이 이해할 수 있는 이진 코드
ex)0101010....

구현체가 뭔데?

우리는 파이썬을 다운받을 때 인터프리터만 다운받지 않는다.
파이썬 인터프리터 + 가상머신 + 컴파일러를 패키지로 다운받는다.

  • 파이썬은 언어하나만 일컫는 말이 아니라, 인터프리터, 가상머신, 바이트코드로의 컴파일러 역할을 모두 수행하는 구현체를 뜻하는 말이다.

이렇게 파이썬의 철학을 구현한 구현체에는 종류가 있고, Python과 PyPy모두 이런 구현체의 일부이다. 일반적으로 Python하면 표준인 CPython을 말한다.

CPython

▶ 파이썬의 공식 구현체로, c/c++로 작성된 인터프리터이다. 즉, 가장 일반적으로 사용되는 파이썬 버전이다.

▶ CPython은 인터프리터 이면서 컴파일러이다. 우리가 작성하는 Python 코드를 bytecode로 컴파일 하고 실행한다. 다시 말해, python 코드를 C언어로 바꾸는 것이 아니라 컴파일하여 bytecode로 바꾸고 그 다음에 interpreter(virtual machine)가 실행한다.

그렇다면 PyPy는 뭘까?

PyPy

▶ 파이썬으로 구현한 파이썬이다! (신기해라)

▶ Just-In-Time(JIT) 컴파일러를 사용해서 CPython보다 빠르단다.

JIT 컴파일

C나 C++에서 하는 것처럼 프로그램을 실행하기 전에 처음 한 번 컴파일하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말한다.

보통 인터프리터 방식의 언어 구현들이 성능 향상을 목적으로 도입하는 경우가 많은데, JIT 컴파일러는 같은 코드를 매번 해석하는 대신 처음 실행될 때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한 뒤, 이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있다. 바이트코드 컴파일을 사용하는 Java도 바이트코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다.

결론

  • 파이썬언어를 구현하는 다양한 구현체들이 있다.
  • CPython(표준) : C로 만들었고, 인터프리터 방식을 구현했다.
    파이썬코드 -> 바이트 코드로 변환(일종의 컴파일이지만 cpu레벨이 아님) -> 가상머신이 한줄씩 인터프리팅해서 실행
  • PyPy : 파이썬으로 만들었고, 캐싱을 활용하는 JIT 컴파일러를 활용하기에 속도가 빠르다.
  • 백준풀때는 웬만하면 PyPy로 내자;

0개의 댓글