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


264

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

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

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

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


43
Nitpick : PyPy PyPyPy입니다. Py- * 접두사를 투영 연산자로 생각하십시오.
u0b34a0f6ae

확인. CPython보다 PyPy를 선호해야합니까? 단점이 있습니까?
balki

10
PyPy는 런타임 최적화에 탁월하지만 내부가 다르기 때문에 널리 사용되는 여러 C 확장과 호환되지 않습니다 .
Cees Timmerman

4
속도 이득이 이론적으로 어떻게 가능한지에 관해 거의 모든 사람들이 그 질문을 놓치고 있습니다. 그러나 생각해보십시오 : 파이썬은 튜링 머신처럼 무엇이든 할 수 있습니다. 결국을 호출 할 수 있습니다 gcc. 따라서 CPython에서 실행되는 일부 Python 코드를 작성하여 다른 일부 Python 코드를 해석하고 C로 변환 gcc한 다음을 실행 한 다음 컴파일 된 프로그램을 실행할 수 있습니다. 코드가 자주 호출되면 더 빠를 수 있습니다.
osa

답변:


155

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로 작성됩니다. 파이썬 인터프리터 / 컴파일러가 파이썬으로 작성되지 않은 이유가 있습니까?


82
이 답변에는 PyPy의 속도에 대한 주요 설명이 완전히 빠져 있습니다. PyPy는 실제로 Python에서는 구현되지 않지만 RPython 에서는 PyPy 인터프리터를 생성하기 위해 RPython 코드가 정적으로 컴파일되고 최적화 된다고 언급하지 않습니다 (위에서 실행할 수있는 유효한 Python 코드 일뿐입니다) CPython보다 훨씬 느리게). 그들이 "정상 파이썬"에서 구현 한 것은 RPython "컴파일러"(블록 따옴표에 언급 된 번역 프레임 워크)입니다.
Ben

12
이것은 lede를 묻습니다. 대부분의 성능은 C에서 통역사 (CPython보다 훨씬 느리게 만들지 않음)와 핫 경로를 훨씬 빠르게 만드는 JIT로 변환됩니다.
Tobu

4
"업데이트 : 최근에 신중하게 조작 된 예에서 PyPy는 gcc -O3으로 컴파일 된 유사한 C 프로그램보다 성능이 뛰어납니다." 해당 게시물 아래의 첫 번째 댓글을 읽으면 해당 게시물 작성자가 링크 타임 최적화를 알지 못합니다. 링크 타임 최적화를 사용하면 C 코드가 더 빠르게 실행됩니다.
Ali

2
블로그 게시물은 2011 년에, 2014 년에는이 답변에 올랐습니다. 또한이 의견에는 공유 라이브러리가 언급되어 있습니다. 이것 (얼마나 블로그 게시물)이 얼마나 유효한지 모르겠습니다. 관련된 모든 기술은 지난 몇 년 동안 크게 바뀌 었습니다.
Noufal Ibrahim

1
Pypy가 동등하게 C보다 더 빠르도록 정교하게 제작 된 두 가지 예에서, 각각은 매우 특정한 이유로 벤치 마크에서 더 빠릅니다. 첫 번째는 Pypy가 엄격한 루프 계산을 수행 할 수있을 정도로 똑똑하기 때문에 사용 된 카운트가 전혀 없기 때문에 두 번째 조합을 위해 두 번째를 완전히 삭제할 수 있습니다 (JIT 패스). "printf"함수의 예는 문자 그대로 정수만 방출 할 수 있도록 특화되어 있으며 반복 된 malloc (메모리 할당 오버 헤드)을 제거합니다.
amcgregor

291

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

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


4
나는 차이 :( 수행을 couldnt
polvoazul

37
의 차이 @polvoazul 최적화 된 언어 구현 및 최적화 를? CPython이 최적화 된 구현이라고 말할 때 개발자는 인터프리터 자체의 내부 알고리즘을 만들고 내부 데이터 구조를 효율적으로 실행하려고합니다. 최적화 구현, OTOH는 분석 할 최종 사용자의 코드를보다 효율적으로 실행하기를 변환하는 방법을 알아 내려고 시도합니다.
Ben

23

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

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


JIT는 PyPy와 동일한 레벨에서 실행되는 Python 코드를 생성합니까, 아니면 PyPy가 실행되는 Python 구현 레벨에서 실행되는 실제 원시 코드를 생성합니까?
Edmund

3
실제 네이티브 코드 ( 여기 참조 ); 정확한 32 비트 x86 코드
Marcelo Cantos

11

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

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


8
PyPy는 CPython 위에서 실행되지만이 모드에서는 원하는 속도 향상을 제공하지 않습니다. :-) codespeak.net/pypy/dist/pypy/doc/…
Frank V
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.