평소에 알고리즘 문제를 풀면서 Python을 지원하는 언어를 선택할 때, Python3와 PyPy3가 대표적으로 있었다.
원래 알던 개념은 PyPy3가 Python3의 실행시 시간이 매우 오래 걸린다는 단점이 있어, 그것을 개선하고자 JIT컴파일 방식을 도입한 것이라고 알고 있었다.
그러면, PyPy3를 이용하는 것이 무조건 효율적인데, Python3도 지원하는 이유가 무엇일까 궁금해졌다. 또한 여러 자료들을 찾아보면서, 특정경우에는 메모리, 시간 모두 Python3로 선택하는 것이 우수할 경우가 있었고, 또 다른 경우에는 메모리는 Python3가 우세하지만 시간 상으로는 PyPy3가 우수한 경우도 있었다.
컴파일 언어vs 인터프리터 언어의 개념 비교해 보면
컴파일 언어 : 소스 코드를 기계어로 컴파일(Compile time) → 실행파일 만듦 → 실행(Run time)
인터프리터 언어 : 코드를 한줄씩 읽어 가며 실행
- 따라서 수정상황이 발생하면, 소스 전체를 다시 컴파일 할 필요가 없고, 코드 수정 후 바로 실행가능한 것이 인터프리터 언어이다.
그러면 Python이 어떻게 동작하는 지 보자.
일반적으로 python이 C로 구현되어 있다고 알려져 있는데, 그 구현체가 CPython이다. 가장 처음 만들어진 python 구현체이다.
CPython은 언터프리터이면서 컴파일러이다. 우리가 작성하는 python코드를 bytecode로 컴파이라고 실행한다. 다시 말해 ,python코드를 C언어로 바꾸는 것이 아니라, 컴파일 하여 bytecode로 바꾸고 그 다음 인터프리터(가장 머신)가 실행한다.
(참고로 Cpython 인터프리터 실행 중에 단점이 있는데, GIL(global interpreter lock)을 사용한다는 것이다. bytecode를 실행할 때에 여러 thread를 사용할 경우, 전체에 lock을 걸어서 한번에 하나의 thread만이 python객체에 접근하도록 제한하는 것이다. 하지만 single thread일 떄는 문제가 없고, GIL단점을 보안하기 위한 방법들이 존재하고 있어 GIL로 인한 불편함을 느낄 가능성은 거의 없다고 한다..)
JIT컴파일을 도입하여 CPython보다 빠르다고 알려진 PyPy구현체를 설명하려고 한다.
PyPy3에서 사용하는 JIT(just in time) 컴파일이란 프로그램을 실행하기 전에 컴파일 하는 대신, 프로그램을 실행하는 시점에서 필요한 부분들을 즉석으로 컴파일 하는 방식이고 보통 인터프리터 언어의 성능 향상을 목적으로 도입하는 경우가 많다. 인터프리트 하면서 자주 쓰이는 코드를 캐싱하기 때문에 인터프리터의 느린 실행속도를 개선할 수 있다. JVM에서도 바이트 코드를 기계어로 번역할 때 JIT 컴파일러를 사용한다.
정리하면, PyPy3에서는 실행시, 자주 쓰이는 코드를 캐싱하는 기능이 있기 때문에 ,
즉 메모리를 조금 더 사용하여 그것들을 저장하고 있어, 실행속도를 개선할 수 있다는 것이기 때문에,
간단한 코드상에서는 Python3가 메모리, 속도 측에서 우세할 수 있는 것이고,
복잡한 코드(반복)을 사용하는 경우에서는 PyPy3가 우세하기 때문에
코드 상황에 맞추어 두 구현체(PyPy3, Python3)를 적절하게 사용하는 것이 효율적이라고 할 수 있다.
'Engineering WIKI > Python' 카테고리의 다른 글
파이썬 2진수, 8진수, 10진수, 16진수 변환 (0) | 2022.05.26 |
---|---|
추상클래스(abstract class) (1) | 2022.05.25 |
파이썬 람다식 (0) | 2022.05.25 |
파이썬 퀵 정렬 (0) | 2022.05.25 |
Python TDD (0) | 2022.05.23 |
파이썬 상속 (Inheritance) (0) | 2022.05.23 |
유사 딕셔너리 defaultdict() 활용법 (0) | 2022.05.19 |
문자열 split() 과 split(" ") 차이 (0) | 2022.05.19 |