본문 바로가기

Python/기타

Python - 파이썬과 PyPy

파이썬은 강력하고 유연하며, 사용하기 쉬운 언어로 유명하다. 그러나 파이썬의 가장 큰 단점은 속도이다. 파이썬은 굉장히 느리다. 이를 개선시키기 위한 여러 시도들이 있는데, 그 중 PyPy를 알아보려고 한다.

 

파이썬의 속도

파이썬은 인터프리터 언어이며, 인터프리터로 동작하는 스크립트 언어이다. 인터프리터 언어는 코드 한줄 한줄을 그 때 그 때 기계어로 번역하여 실행한다.

 

인터프리터와 컴파일러에 대해서는 아래를 참고하도록 하자.

https://m.blog.naver.com/ehcibear314/221228200531

 

컴파일러와 인터프리터의 차이

https://blog.naver.com/ehcibear314/221228096291 우선 윗 글을 먼저 읽고 오는 것이 좋다. 컴파일러, 인...

blog.naver.com

 

인터프리터에는 분명히 장점도 있지만 단점도 있다. 이러한 단점 때문에 실제로 파이썬 컴파일러 또한 존재한다. 해당 컴파일러를 실행하면 C와 마찬가지로 컴파일된 실행파일이 나온다.

 

 

 

오래된 자료에서 퍼온 속도 비교 자료이다. 파이썬2의 속도에 관한 자료이긴 하지만 파이썬이 느리다는 것을 보여주는 예라고 생각한다.

 

파이썬 구현체

기본적으로 우리가 말하는 파이썬은 C로 구현되어 있다. 이 구현체를 다른 구현체와 구분할 때 이를 CPython이라고 부른다. 파이썬의 기본 인터프리터인 CPython은 파이썬을 중간 바이트코드로 컴파일하고, 이 바이트코드가 가상 머신에 의해 인터프리트되는 방식이다.

 

이 외에도 C언어로 변환하고 컴파일하는 방법으로 구현한 Cython (CPython과는 다른 것이다), Java로 구현한 Jython, .NET Framework로 구현한 IronPython 등이 있다. Cython은 빠르지만, 나머지들은 굉장히 느리다고 알려져 있다. 그러나 파이썬을 파이썬으로 구현한 PyPy라는 구현체가 존재한다. PyPy는 다른 구현체들에 비해 훨씬 빠르다.

 

PyPy

 

PyPy는 기본 파이썬의 인터프리터인 CPython을 대체하는 구현체이다. PyPy는 JIT (Just-In-Time) 컴파일을 사용하여 파이썬 코드를 머신 네이티브 어셈블리 언어로 변환한다. PyPy는 수행하는 작업에 따라 성능 향상이 상당 수준으로 가능하다. 평균적으로 기존 파이썬 성능의 7.6배, 작업에 따라서는 50배 이상의 성능 향상을 보여주기도 한다.

 

PyPy의 최적화 방법은 동적 언어를 위한 다른 JIT 컴파일러에 사용되는 방법과 같다. 실행 중인 파이썬 프로그램을 분석하여 프로그램에서 생성되고 사용되는 개체의 형식 정보를 확인한 후, 이 형식 정보를 가이드 삼아서 속도를 높인다. 예를 들어, 파이썬 함수가 한두 개의 개체 유형만 다루는 경우 PyPy는 해당 사례만 처리하는 머신 코드를 생성한다. 또한 PyPy의 최적화는 런타임에 자동으로 처리되어 일반적으로는 성능 조정이 필요 없다.

 

그러나 PyPy는 특정 종류의 프로그램에선 그 효과가 오히려 반감되거나 아예 없어지는 한계가 존재한다. 따라서 기본 C파이썬 런타임의 완전한 범용 대체재가 되지는 못한다.

 

PyPy는 순수 파이썬 앱에서 가장 효과적이다. 즉, PyPy는 CPython의 네이티브 바이너리 인터페이스를 에뮬레이션하는 방식으로 인해 NumPy와 같은 C 라이브러리와 접속하는 파이썬 패키지에서는 성능이 떨어진다. PyPy의 개발자들은 이를 개선하기 위해 이 문제를 조금씩 수정했고, 현재 NumPy와 PyPy는 따라서 원활하게 호환된다. 그러나 아직도 C확장에 대한 최대한의 호환성을 원한다면 C파이썬을 사용해야 한다.

 

PyPy가 파이썬 프로그램을 최적화하는 방법에 따른 이점 중 하나는 실행 시간이 긴 프로그램에서의 최적화 효과가 크다는 점이다. 프로그램 실행 시간이 길 수록 PyPy가 수집할 수 있는 런타임 형식 정보가 많아지고 그만큼 더 최적화할 수 있다.

 

구현 방식

PyPy의 접근법은 다음과 같다.

 

  1. RPython이라고 하는, 파이썬 문법을 엄격하게 만들어 컴파일이 되게 만든 해석기를 Python 코드로 작성한다.
  2. RPython의 효과적인 컴파일을 위해 다른 언어로 툴체인을 만든다.
  3. Python 구현 (런타임) 을 RPython 문법으로 작성한다.
  4. 3에서 만든 구현을 1 또는 2에서 만든 RPython 해석기로 컴파일한다.
  5. 4에서 만든 후보를 이전 또는 다른 구현과 비교 (성능 측정), 만족스럽지 않으면 수정한다.
  6. 5에서 만족스러운 결과를 냈다면 출시하고 1 또는 2 부터 다시 시작한다.

 

 

출처

https://m.blog.naver.com/ehcibear314/221228200531

http://www.itworld.co.kr/news/122334

https://namu.wiki/w/Python#s-4

https://hagun.tistory.com/2822096

https://www.a-ha.io/questions/41dd640ebc152ab4968b5e3a7dc61dd9