PyPy는 무엇입니까? 고통없는 더 빠른 Python

Python은 강력하고 유연하며 사용하기 쉬운 것으로 명성을 얻었습니다. 이러한 장점은 점점 더 다양한 응용 프로그램, 워크 플로 및 분야에서 사용하게되었습니다. 그러나 언어의 디자인 (해석 된 특성, 런타임 역 동성)은 Python이 항상 C 또는 C ++와 같은 기계 고유 언어보다 훨씬 느리다는 것을 의미합니다.

수년에 걸쳐 개발자들은 Python의 속도 제한에 대한 다양한 해결 방법을 제시했습니다. 예를 들어, 성능 집약적 인 작업을 C로 작성하고 Python으로 래핑 할 수 있습니다. 많은 기계 학습 라이브러리가 정확히 이것을 수행합니다. 또는 C로 컴파일 할 수있는 런타임 유형 정보로 Python 코드를 뿌릴 수있는 프로젝트 인 Cython을 사용할 수 있습니다.

그러나 대안은 결코 이상적이지 않습니다. 기존 Python 프로그램 그대로 가져 와서 훨씬 빠르게 실행할 수 있다면 좋지 않을까요  ? 이것이 바로 PyPy가 할 수있는 일입니다.

관련 비디오 : Python 용 PyPy 런타임 사용

PyPy 대 CPython

PyPy는 기본 Python 인터프리터 인 CPython의 드롭 인 대체품입니다. CPython은 Python을 가상 머신에서 해석되는 중간 바이트 코드로 컴파일하는 반면, PyPy는 JIT (Just-In-Time) 컴파일을 사용하여 Python 코드를 머신 네이티브 어셈블리 언어로 번역합니다.

수행중인 작업에 따라 성능이 크게 향상 될 수 있습니다. 평균적으로 PyPy는 Python 속도를 약 7.6 배 높이고 일부 작업은 50 배 이상 가속화합니다. CPython 인터프리터는 단순히 PyPy와 동일한 종류의 최적화를 수행하지 않으며, 이것이 디자인 목표 중 하나가 아니기 때문에 결코 그렇게하지 않을 것입니다.

가장 좋은 점은 PyPy가 제공하는 이점을 잠금 해제하기 위해 개발자 측에서 거의 또는 전혀 노력할 필요가 없다는 것입니다. CPython을 PyPy로 교체하기 만하면 대부분의 작업이 완료됩니다. 아래에 설명 된 몇 가지 예외가 있지만 PyPy의 명시된 목표는 기존의 수정되지 않은 Python 코드를 실행하고 자동 속도 향상을 제공하는 것입니다.

PyPy는 현재 프로젝트의 다양한 구현 방식을 통해 Python 2와 Python 3을 모두 지원합니다. 즉, 실행할 Python 버전에 따라 다른 버전의 PyPy를 다운로드해야합니다. PyPy의 Python 2 브랜치는 훨씬 더 오래되었지만 Python 3 버전은 최근에 속도가 빨라졌습니다. 현재 Python 3.5 (프로덕션 품질) 및 Python 3.6 (베타 품질)을 모두 지원합니다.

모든 핵심 Python 언어를 지원하는 것 외에도 PyPy는 pip 패키징 또는  virtualenv 가상 환경 과 같은 Python 에코 시스템의 대부분의 도구와 함께 작동  합니다. 대부분의 Python 패키지, 심지어 C 모듈이있는 패키지도있는 그대로 작동해야하지만 아래에서 설명 할 제한 사항이 있습니다.

PyPy의 작동 원리

PyPy는 동적 언어에 대해 다른 Just-In-Time 컴파일러에서 발견되는 최적화 기술을 사용합니다. 실행중인 Python 프로그램을 분석하여 프로그램에서 생성되고 사용되는 객체의 유형 정보를 확인한 다음 해당 유형 정보를 지침으로 사용하여 작업 속도를 높입니다. 예를 들어 Python 함수가 하나 또는 두 개의 서로 다른 객체 유형에서만 작동하는 경우 PyPy는 이러한 특정 경우를 처리하기 위해 기계어 코드를 생성합니다.

PyPy의 최적화는 런타임에 자동으로 처리되므로 일반적으로 성능을 조정할 필요가 없습니다. 고급 사용자는 특수한 경우에 더 빠른 코드를 생성하기 위해 PyPy의 명령 줄 옵션을 실험 할 수 있지만 이것이 필요한 경우는 거의 없습니다.

PyPy는 CPython이 일부 내부 기능을 처리하는 방식에서 출발하지만 호환되는 동작을 유지하려고합니다. 예를 들어 PyPy는 CPython과 다르게 가비지 수집을 처리합니다. 모든 객체가 범위를 벗어나면 즉시 수집되는 것은 아니므로 PyPy에서 실행되는 Python 프로그램은 CPython에서 실행할 때보 다 더 큰 메모리 공간을 표시 할 수 있습니다. 그러나 당신은 여전히 노출 파이썬의 높은 수준의 가비지 컬렉션 컨트롤 사용할 수 있습니다 gc와 같은 모듈을 gc.enable(), gc.disable()하고 gc.collect().

런타임시 PyPy의 JIT 동작에 대한 정보를 원하는 경우 PyPy에는 pypyjitPython 애플리케이션에 많은 JIT 후크를 노출 하는 모듈이 포함 되어 있습니다. JIT에서 제대로 수행되지 않는 것처럼 보이는 기능 또는 모듈이있는 경우 이에 pypyjit대한 자세한 통계를 얻을 수 있습니다.

또 다른 PyPy 전용 모듈 인은 PyPy와 관련된 __pypy__다른 기능을 노출하므로 이러한 기능을 활용하는 앱을 작성하는 데 유용 할 수 있습니다. Python의 런타임 역 동성으로 인해 PyPy가있을 때는 이러한 기능을 사용하고없는 경우에는 무시하는 Python 앱을 구성 할 수 있습니다.

PyPy 제한

PyPy가 마법처럼 보이지만 마법이 아닙니다. PyPy에는 특정 종류의 프로그램에 대한 효과를 줄이거 나 없애는 특정 제한이 있습니다. 아아, PyPy는 재고 CPython 런타임을 완전히 대체하는 것은 아닙니다.

PyPy는 순수 Python 앱에서 가장 잘 작동합니다.

PyPy는 항상 "순수한"Python 애플리케이션, 즉 Python으로 작성된 애플리케이션에서 최고의 성능을 발휘했습니다. NumPy와 같은 C 라이브러리와 인터페이스하는 Python 패키지는 PyPy가 CPython의 기본 바이너리 인터페이스를 에뮬레이션하는 방식으로 인해 잘 진행되지 않았습니다. 

PyPy의 개발자는이 문제를 해결하고 PyPy를 C 확장에 의존하는 대부분의 Python 패키지와 더 호환되도록 만들었습니다. 예를 들어 Numpy는 현재 PyPy와 매우 잘 작동합니다. 그러나 C 확장과의 호환성을 최대화하려면 CPython을 사용하십시오.

PyPy는 오래 실행되는 프로그램에서 가장 잘 작동합니다.

PyPy가 Python 프로그램을 최적화하는 방법의 부작용 중 하나는 더 오래 실행되는 프로그램이 최적화에서 가장 많은 이점을 얻는다는 것입니다. 프로그램이 오래 실행 될수록 PyPy가 수집 할 수있는 런타임 유형 정보가 많고 더 많은 최적화를 수행 할 수 있습니다. 일회성 Python 스크립트는 이런 종류의 이점을 얻지 못합니다. 이점이있는 응용 프로그램에는 일반적으로 오랜 시간 동안 실행되거나 백그라운드에서 지속적으로 실행되는 루프가 있습니다 (예 : 웹 프레임 워크).

PyPy는 사전 컴파일을 수행하지 않습니다.

PyPy는   Python 코드를 컴파일 하지만  Python 코드 용 컴파일러 는 아닙니다  . PyPy가 최적화를 수행하는 방식과 Python 고유의 역 동성 때문에 결과 JITted 코드를 독립 실행 형 바이너리로 내보내고 재사용 할 수있는 방법이 없습니다. 각 프로그램은 각 실행에 대해 컴파일되어야합니다. Python을 독립 실행 형 앱으로 실행할 수있는 더 빠른 코드로 컴파일하려면 Cython, Numba 또는 현재 실험적인 Nuitka 프로젝트를 사용하세요.