[python] PyPy — CPython을 어떻게 이길 수 있습니까?

로부터 구글 오픈 소스 블로그 :

PyPy는 고급 기술을 사용하여 CPython보다 나은 성능을 얻으려고 Python에서 Python을 다시 구현 한 것입니다. 수년간의 노력이 마침내 성과를 거두었습니다. 우리의 속도 결과는 종종 약간 느리게, 실제 애플리케이션 코드에서 최대 2 배의 속도 향상, 작은 벤치 마크에서 최대 10 배의 속도 향상에 이르기까지 CPython을 능가합니다.

이것이 어떻게 가능한지? PyPy를 구현하기 위해 어떤 Python 구현이 사용 되었습니까? CPython ? PyPyPy 또는 PyPyPyPy가 점수를 꺾을 확률은 얼마입니까?

(관련 메모에서 … 왜 이런 식으로 누군가 시도합니까?)



답변

Q1. 이것이 어떻게 가능한지?

CPython이 계산으로 수행하는 수동 메모리 관리는 경우에 따라 자동 관리보다 느릴 수 있습니다.

CPython 인터프리터 구현의 제한으로 인해 PyPy가 수행 할 수있는 특정 최적화 (예 : 세밀한 잠금)가 금지됩니다.

Marcelo가 언급했듯이 JIT. 객체 유형을 즉석에서 확인할 수 있으면 호출하려는 메소드에 최종적으로 도달하기 위해 여러 포인터 역 참조를 수행 할 필요가 없습니다.

Q2. PyPy를 구현하기 위해 어떤 Python 구현이 사용 되었습니까?

PyPy 인터프리터는 RPython에서 구현되는데, 이는 정적으로 유형이 지정된 Python의 서브 세트입니다 (CPython 인터프리터가 아닌 언어). -자세한 내용은 https://pypy.readthedocs.org/en/latest/architecture.html 을 참조하십시오.

Q3. PyPyPy 또는 PyPyPyPy가 점수를 꺾을 확률은 얼마입니까?

그것은 이러한 가상 해석기의 구현에 달려 있습니다. 예를 들어 그중 하나가 소스를 가져 와서 일종의 분석을 수행하고 잠시 동안 실행 한 후 엄격한 대상 특정 어셈블리 코드로 직접 변환하면 CPython보다 훨씬 빠를 것이라고 생각합니다.

업데이트 : 최근에 신중하게 제작 된 예제 에서 PyPy는로 컴파일 된 비슷한 C 프로그램보다 성능이 뛰어났습니다 gcc -O3. 그것은 생각이 많지만 몇 가지 아이디어를 보여줍니다.

Q4. 왜 이런 식으로 누군가 시도합니까?

공식 사이트에서. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

우리는 다음을 제공하는 것을 목표로합니다.

  • 생산을위한 공통 번역 및 지원 프레임 워크
    동적 언어 구현 하기
    언어 사양과 구현
    측면 사이 의 명확한 분리를 강조합니다 . 우리는 이것을 RPython toolchain_ 라고 부릅니다 .

  • 위의 툴체인을 사용하여 하위 수준의 세부 사항을 인코딩하지 않고도 새로운 고급 고급 기능을 사용할 수 있도록하는 유연하고 빠른 Python_ Language 구현.

이러한 방식으로 우려를 분리함으로써 Python 및 기타 동적 언어 구현은 모든 동적 언어에 대한 Just-in-Time 컴파일러를 자동으로 생성 할 수 있습니다. 또한 대상 플랫폼, 메모리 및 스레딩 모델, 가비지 수집 전략 및 적용 여부와 같은 최적화와 같이 사용자가 통제 할 수 없었던 많은 것을 포함하여 구현 결정에 대한 혼합 및 일치 접근 방식을 제공합니다. 처음에 JIT.

C 컴파일러 gcc는 C로 구현되고 Haskell 컴파일러 GHC는 Haskell로 작성됩니다. 파이썬 인터프리터 / 컴파일러가 파이썬으로 작성되지 않은 이유가 있습니까?


답변

“PyPy는 Python에서 Python을 다시 구현 한 것입니다”는 기술적으로 사실이지만 PyPy, IMHO를 설명하는 다소 잘못된 방법입니다.

PyPy에는 두 가지 주요 부분이 있습니다.

  1. 번역 프레임 워크
  2. 통역

번역 프레임 워크는 컴파일러입니다. RPython 코드를 C (또는 다른 대상)로 컴파일 하여 가비지 수집 및 JIT 컴파일러와 같은 측면을 자동으로 추가합니다. 그것은 할 수 없습니다 임의의 파이썬 코드 만 RPython을 처리합니다.

RPython은 일반적인 Python의 하위 집합입니다. 모든 RPython 코드는 Python 코드이지만 다른 방법은 아닙니다. RPython은 기본적으로 “PyPy의 번역 프레임 워크로 번역 할 수있는 Python의 하위 집합”이기 때문에 RPython에 대한 공식적인 정의는 없습니다. 그러나 번역하기 위해서는 RPython 코드를 정적으로 입력해야합니다 (유형은 유추되지 않지만 선언하지는 않지만 변수마다 엄격하게 하나의 유형입니다). 선언 / 수정 / 런타임시 클래스.

인터프리터는 RPython으로 작성된 일반적인 파이썬 인터프리터입니다.

RPython 코드는 일반적인 Python 코드이므로 모든 Python 인터프리터에서 실행할 수 있습니다. 그러나 PyPy의 속도 주장 중 그 어느 것도 그런 식으로 실행하지 않습니다. 인터프리터를 번역하는 시간 이 오래 걸리기 때문에 테스트주기가 매우 빠릅니다 .

PyPyPy 또는 PyPyPyPy에 대한 추측은 실제로 의미가 없다는 것을 이해해야합니다. RPython으로 작성된 통역사가 있습니다. 파이썬을 빠르게 실행하는 C 코드로 변환합니다. 프로세스가 중지됩니다. 다시 처리하여 속도를 높일 수있는 RPython은 없습니다.

따라서 “PyPy가 CPython보다 빠를 수있는 방법”도 상당히 분명해졌습니다. PyPy는 JIT 컴파일러를 포함하여 더 나은 구현을 제공합니다 (일반적으로 JIT 컴파일러가 없으면 빠르지 않습니다. 즉, PyPy는 JIT 컴파일이 가능한 프로그램에 대해서만 빠릅니다). CPython은 파이썬 언어의 최적화 된 구현으로 설계되지 않았습니다 ( 차이점을 따르는 경우 최적화 된 구현 으로 만들려고하지만 ).


PyPy 프로젝트의 혁신적인 부분은 정교한 GC 스키마 또는 JIT 컴파일러를 직접 작성하지 않는다는 것입니다. 그들은 RPython에서 인터프리터를 비교적 간단하게 작성하며, 모든 RPython은 Python보다 낮은 수준이지만 여전히 C보다 훨씬 높은 객체 지향 가비지 수집 언어입니다. 그런 다음 번역 프레임 워크 는 GC 및 JIT와 같은 것을 자동으로 추가합니다. 번역 프레임 워크는 그래서 노력하지만 PyPy python 인터프리터에도 동일하게 적용되지만 구현이 변경되어 실험을 훨씬 더 자유롭게 수행하여 성능을 향상시킬 수 있습니다 (GC 버그 소개 또는 변경에 대처하기 위해 JIT 컴파일러 업데이트에 대한 걱정없이). 또한 Python3 인터프리터를 구현할 때 자동으로 동일한 이점을 얻습니다. PyPy 프레임 워크로 작성된 다른 모든 통역사 (다양한 연마 단계에 여러 가지가 있음). PyPy 프레임 워크를 사용하는 모든 인터프리터는 프레임 워크에서 지원하는 모든 플랫폼을 자동으로 지원합니다.

따라서 PyPy 프로젝트의 진정한 이점은 동적 언어를위한 효율적인 플랫폼 독립적 인터프리터 구현의 모든 부분을 가능한 한 많이 분리하는 것입니다. 그런 다음 한 곳에서 한 가지 좋은 구현을 생각해 내면 많은 통역사에서 재사용 할 수 있습니다. “지금 파이썬 프로그램이 더 빨리 실행됩니다”와 같은 즉각적인 승리는 아니지만 미래에 대한 큰 전망입니다.

그리고 파이썬 프로그램을 더 빨리 실행할 수 있습니다.


답변

PyPy는 Python으로 구현되었지만 JIT 컴파일러를 구현하여 즉시 네이티브 코드를 생성합니다.

파이썬 위에 PyPy를 구현하는 이유는 아마도 매우 생산적인 언어 일 것입니다. 특히 JIT 컴파일러가 호스트 언어의 성능을 다소 관련시키지 않기 때문입니다.


답변

PyPy는 제한된 파이썬으로 작성되었습니다. 내가 아는 한 CPython 인터프리터 위에서 실행되지 않습니다. 제한된 Python은 Python 언어의 하위 집합입니다. PyPy 인터프리터 인 AFAIK는 머신 코드로 컴파일되므로 설치시 런타임에 파이썬 인터프리터를 사용하지 않습니다.

귀하의 질문은 PyPy 인터프리터가 코드를 실행하는 동안 CPython 위에서 실행되는 것으로 예상됩니다.
편집 : 예, PyPy를 사용하려면 먼저 PyPy 파이썬 코드를 C로 변환하고 gcc로 빌드하거나 jvm 바이트 코드 또는 .Net CLI 코드로 빌드하십시오. 시작하기를 참조하십시오


답변