programing

PyPy -- 어떻게 CPython을 이길 수 있을까요?

projobs 2023. 2. 3. 21:10
반응형

PyPy -- 어떻게 CPython을 이길 수 있을까요?

Google 오픈 소스 블로그에서:

PyPy는 Python에서 Python을 다시 구현한 것으로, CPython보다 더 나은 성능을 얻기 위해 고급 기술을 사용합니다.다년간의 노력이 마침내 결실을 맺었다.당사의 속도 결과는 실제 애플리케이션 코드에서 최대 2배의 속도 향상, 소규모 벤치마크에서 최대 10배의 속도 향상 등 CPython을 능가하는 경우가 많습니다.

이것이 어떻게 가능한 걸까요?PyPy를 구현하기 위해 어떤 Python 구현이 사용되었습니까?CPython?그리고 PyPy 또는 PyPyPyPy가 그들의 점수를 이길 가능성은 얼마나 될까?

(관련 사항입니다만...왜 이런 일을 시도했을까요?)

"PyPy는 Python을 Python에 다시 구현한 것입니다."는 기술적으로 사실이지만 IMHO인 PyPy를 설명하는 것은 다소 오해의 소지가 있는 방법입니다.

PyPy에는 크게 두 가지 부분이 있습니다.

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

번역 프레임워크는 컴파일러입니다.RPython 코드를 C(또는 다른 타깃)로 컴파일하여 가비지 컬렉션이나 JIT 컴파일러 등의 측면에 자동으로 추가합니다.임의 Python 코드는 처리할 수 없으며 RPython만 처리할 수 있습니다.

RPython은 일반 Python의 서브셋입니다.모든 RPython 코드는 Python 코드이지만 그 반대는 아닙니다.RPython은 기본적으로 "PyPy의 번역 프레임워크로 번역할 수 있는 Python의 서브셋"이기 때문에 RPython에 대한 공식적인 정의는 없습니다.그러나 변환하기 위해서는 RPython 코드가 정적으로 입력되어야 하며(유추된 유형은 선언하지 않지만 변수당 하나의 유형으로 한정됩니다), 실행 시 함수/클래스를 선언/수정하는 등의 작업도 할 수 없습니다.

그러면 인터프리터는 RPython으로 작성된 일반 Python 인터프리터입니다.

RPython 코드는 일반 Python 코드이므로 모든 Python 인터프리터에서 실행할 수 있습니다.그러나 PyPy의 속도 주장은 이러한 방식으로 실행함으로써 얻어지는 것이 아닙니다. 이는 단지 빠른 테스트 사이클을 위한 것입니다. 통역에는 오랜 시간이 걸리기 때문입니다.

PyPyPy 또는 PyPyPyPy에 대한 추측은 사실 이치에 맞지 않는다는 것을 즉시 알 수 있을 것입니다.RPython으로 된 통역이 있습니다.Python을 빠르게 실행하는 C코드로 변환합니다.이것으로 프로세스가 정지합니다.다시 처리함으로써 속도를 높일 수 있는 RPython은 없어집니다.

따라서 "PyPy가 CPython보다 더 빠른 것이 어떻게 가능한가?"도 상당히 명백해집니다.PyPy는 JIT 컴파일러를 포함한 더 나은 구현을 가지고 있습니다(JIT 컴파일러가 없으면 일반적으로 그다지 빠르지 않습니다.즉, PyPy는 JIT 컴파일러의 영향을 받기 쉬운 프로그램에서만 더 빠릅니다).CPython은 Python 언어를 고도로 최적화하도록 설계되지 않았습니다(차이점을 따른다면 매우 최적화된 구현을 시도하지만).


PyPy 프로젝트의 가장 혁신적인 점은 정교한 GC 스킴이나 JIT 컴파일러를 손으로 작성하지 않는다는 것입니다.인터프리터는 비교적 간단하게 RPython으로 기술되며, 모든 RPython은 Python보다 낮은 레벨이며, C보다 훨씬 높은 레벨의 객체 지향 가비지 컬렉션 언어입니다.변환 프레임워크에 의해 GC나 JIT 등이 자동으로 추가됩니다.따라서 번역 프레임워크는 큰 노력이지만 PyPy python interpreter에도 동일하게 적용되기 때문에 (GC 버그를 도입하거나 변경에 대처하기 위해 JIT 컴파일러를 갱신할 염려 없이) 퍼포먼스를 향상시키기 위한 실험의 자유도가 높아집니다.또한 Python3 인터프리터를 구현하면 자동으로 동일한 이점을 얻을 수 있습니다.또한 PyPy 프레임워크로 작성된 다른 통역자(광택의 다양한 단계에 숫자가 있음)도 있습니다.또한 PyPy 프레임워크를 사용하는 모든 인터프리터는 프레임워크에서 지원되는 모든 플랫폼을 자동으로 지원합니다.

따라서 PyPy 프로젝트의 진정한 이점은 동적 언어를 위한 효율적인 플랫폼 독립형 인터프리터 구현의 모든 부분을 분리하는 것입니다.그 후, 그것들을 한 장소에서 적절히 실장해, 많은 통역자에게 재이용할 수 있도록 합니다.이는 "내 Python 프로그램이 지금 더 빨리 실행된다"와 같은 즉각적인 성공은 아니지만, 미래를 위한 훌륭한 전망입니다.

Python 프로그램을 더 빠르게 실행할 수 있습니다(아마도).

Q1. 어떻게 이것이 가능합니까?

수동 메모리 관리(CPython이 카운트를 사용하여 수행하는 작업)는 경우에 따라 자동 관리보다 느릴 수 있습니다.

CPython 해석기 구현의 한계는 PyPy가 수행할 수 있는 특정 최적화(예: 미세 입자 잠금)를 배제한다.

Marcelo가 언급했듯이, JIT.오브젝트 타입을 즉시 확인할 수 있기 때문에 호출하는 메서드에 도달하기 위해 여러 포인터 참조를 수행할 필요가 없어집니다.

Q2. PyPy 구현에 사용된 Python은 무엇입니까?

PyPy 인터프리터는 Python(CPython 인터프리터가 아닌 언어)의 정적 유형 서브셋인 RPython에서 구현됩니다.자세한 것은, https://pypy.readthedocs.org/en/latest/architecture.html 를 참조해 주세요.

Q3. 그리고 PyPy 또는 PyPyPy가 점수를 이길 가능성은 얼마나 됩니까?

그것은 이러한 가상의 통역자들의 구현에 달려있을 것이다.예를 들어, 그 중 하나가 소스를 가져와서 분석을 하고, 잠시 실행한 후에 직접 타이트한 타겟 고유의 어셈블리 코드로 변환하면, CPython보다 꽤 빠를 것이라고 생각합니다.

업데이트: 최근 주의 깊게 만든 예에서 PyPy는 다음과 같이 컴파일된 유사한 C 프로그램을 능가했습니다.gcc -O3이것은 조작된 사건이지만 몇 가지 아이디어를 보여줍니다.

Q4. 왜 이런 걸 시도했을까요?

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

델의 목표는 다음과 같습니다.

  • 및 로 제작
    , , 클린 언어 강조

    we we. this this this this라고 합니다.RPython toolchain . . .

  • Python_Language의 컴플라이언스, 유연성, 고속 구현.이 툴체인을 사용하여 하위 수준의 세부사항을 인코딩하지 않고도 새로운 고급 고급 기능을 사용할 수 있습니다.

이와 같이 문제를 분리함으로써 Python 및 기타 동적 언어 구현은 모든 동적 언어에 대한 Just-in-Time 컴파일러를 자동으로 생성할 수 있습니다.또, 타겟 플랫폼, 메모리, 스레드화 모델, 가비지 수집 전략, 적용된 최적화 등, 지금까지 유저가 제어할 수 없었던 것을 포함해, 실장 결정을 조합하는 어프로치가 가능하게 됩니다.

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

PyPy는 Python에서 구현되지만 네이티브 코드를 즉시 생성하기 위해 JIT 컴파일러를 구현합니다.

Python 위에 PyPy를 구현하는 이유는 Python이 단순히 매우 생산적인 언어이기 때문일 것입니다. 특히 JIT 컴파일러가 호스트 언어의 성능을 다소 무관하게 만들기 때문입니다.

PyPy는 Restricted Python으로 작성됩니다.CPython 인터프리터 위에서 동작하지 않는 것으로 알고 있습니다.Restricted Python은 Python 언어의 하위 집합입니다.AFIK는 PyPy 인터프리터를 머신 코드로 컴파일하기 때문에 설치 시 파이썬 인터프리터를 사용하지 않습니다.

당신의 질문은 코드를 실행하는 동안 PyPy 인터프리터가 CPython 위에서 실행되기를 기대하는 것 같습니다.편집: 예, PyPy를 사용하려면 먼저 PyPy python 코드를 C로 변환하고 gcc로 빌드하거나 jvm 바이트 코드 또는 로 변환합니다.넷 CLI 코드「시작」을 참조해 주세요.

언급URL : https://stackoverflow.com/questions/2591879/pypy-how-can-it-possibly-beat-cpython

반응형