[python] PyPy가 6.3 배 더 빠르면 CPython보다 PyPy를 사용해야하는 이유는 무엇입니까?

PyPy 프로젝트 에 대해 많이 들었습니다 . 그들은 사이트CPython 인터프리터 보다 6.3 배 빠르다고 주장했다 .

파이썬과 같은 동적 언어에 대해 이야기 할 때마다 속도가 가장 큰 문제 중 하나입니다. 이를 해결하기 위해 PyPy가 6.3 배 빠릅니다.

두 번째 문제는 악명 높은 GIL ( Global Interpreter Lock) 이라는 병렬 처리 입니다. 이를 위해 PyPy는 GIL-less Python을 제공 있다고 말합니다 .

PyPy가 이러한 큰 문제를 해결할 수 있다면 더 큰 채택을 방해하는 약점은 무엇입니까? 그 말을하는 것입니다, PyPy 전환에서 나 같은 사람, 전형적인 파이썬 개발자 예방 무슨 지금을 ?



답변

참고 : PyPy는이 질문을했을 때보 다 2013 년보다 더 성숙하고 더 잘 지원됩니다. 오래된 정보로부터 결론을 도출하지 마십시오.


  1. PyPy는 다른 사람들이 빠르게 언급 했듯이 C 확장을 강력하게 지원합니다 . 그것은 가지고 있지만, 일반적으로보다 느린 파이썬 속도, 지원을하며 최고의 불확실한을합니다. 따라서 많은 모듈에는 단순히 CPython이 필요합니다 . PyPy는 numpy를 지원하지 않습니다 . PyPy는 이제 numpy를 지원합니다 . 일부 확장은 여전히 ​​지원되지 않습니다 (Panda, SciPy 등) . 변경하기 전에 지원되는 패키지 목록을 살펴보십시오 .
  2. Python 3 지원 은 현재 실험 중입니다. 방금 안정에 도달했습니다! 2014 년 6 월 20 일자로 PyPy3 2.3.1-Fulcrum이 나왔습니다 !
  3. PyPy는 때때로 많은 사람들이 파이썬을 사용하는 “스크립트”에 대해 실제로 더 빠르지 않습니다 . 이것들은 간단하고 작은 것을하는 단기 실행 프로그램입니다. PyPy는 JIT 컴파일러이기 때문에 주요 이점은 장기 실행 시간과 간단한 유형 (예 : 숫자)에서 비롯됩니다. 솔직히 PyPy의 pre-JIT 속도는 CPython에 비해 상당히 나쁩니다 .
  4. 관성 . PyPy로 이전하려면 종종 일부의 사람들과 조직에게 너무 많은 작업이 필요한 재조정이 필요합니다.

이것이 저에게 영향을 미치는 주된 이유입니다.


답변

이 사이트는 PyPy가 CPython보다 6.3 배 빠르다고 주장 하지 않습니다 . 인용 :

모든 벤치 마크의 기하학적 평균은 CPython보다 0.16 또는 6.3 배 빠릅니다.

이것은 귀하가 작성한 총괄 진술과 는 매우 다른 진술이며, 차이점을 이해하면 “PyPy 사용”이라고 말할 수없는 이유 중 적어도 하나를 이해할 것입니다. 내가 따끔 거림처럼 들릴지 모르지만,이 두 문장이 완전히 다른 이유를 이해하는 것이 중요합니다.

그것을 분해하려면 :

  • 이들이 작성한 진술은 사용한 벤치 마크에만 적용됩니다. 프로그램이 벤치 마크 중 하나와 정확히 같은 경우를 제외하고는 프로그램에 대해 아무 것도 말하지 않습니다.

  • 이 진술은 벤치 마크 그룹의 평균 에 대한 것입니다. PyPy를 실행하면 테스트 한 프로그램에 대해서도 6.3 배의 성능 향상을 가져올 것이라는 주장은 없습니다.

  • PyPy가 CPython이 실행 하는 모든 프로그램을 더 빠르게 실행할 것이라는 주장은 없습니다 .


답변

pypy는 100 % 호환되지 않고 컴파일하기 위해 8 기가의 램을 필요로하고 움직이는 목표이며 cpython이 안정적인 곳에서 실험적입니다. ) 이미 배포되어 있습니다.

Pypy는 결코 참조 구현이 될 수는 없지만 좋은 도구입니다.


답변

두 번째 질문은 대답하기가 더 쉽다는 것입니다. 모든 코드가 순수한 파이썬이라면 기본적으로 PyPy를 드롭 인 대체품 으로 사용할 수 있습니다. 그러나 널리 사용되는 많은 라이브러리 (일부 표준 라이브러리 포함)는 C로 작성되고 Python 확장으로 컴파일됩니다. 이 중 일부는 PyPy와 함께 작동하도록 만들 수 있지만 일부는 불가능합니다. PyPy는 Python과 동일한 “앞으로 향한”도구를 제공합니다. 즉, 파이썬입니다. 그러나 내부는 다르므로 해당 내부와 상호 작용하는 도구는 작동하지 않습니다.

첫 번째 질문에 관해서는 첫 번째 질문과 비슷한 Catch-22라고 생각합니다 .PyPy는 속도를 향상시키고 다른 코드와의 상호 운용성을 향상시키기 위해 빠르게 진화하고 있습니다. 이것은 공식보다 더 실험적으로 만들었습니다.

PyPy가 안정적인 상태가되면 더 널리 사용되기 시작할 수 있습니다. 또한 파이썬이 C 기반에서 벗어나는 것이 좋을 것이라고 생각합니다. 그러나 그것은 한동안 일어나지 않을 것입니다. PyPy는 아직이 임계 질량에 도달하지 않은 대부분 의 사람들이 격차를 채우기 위해 동기를 부여 것입니다 당신이 원하는 것 모든 것을 할 수있는 자신에 대한 유용한 충분합니다.


답변

이 주제에 대해 작은 벤치 마크를 수행했습니다. 다른 많은 포스터는 호환성에 대해 좋은 지적을했지만 PyPy는 비트를 움직일 때 그리 빠르지 않습니다. 파이썬을 여러 번 사용하는 경우 실제로 두 개 이상의 서비스간에 비트를 변환하는 것만 존재합니다. 예를 들어, 많은 웹 응용 프로그램에서 데이터 집약적 인 CPU 집중 분석을 수행하지 않습니다. 대신 클라이언트에서 바이트를 가져 와서 일종의 데이터베이스에 저장 한 다음 나중에 다른 클라이언트로 반환합니다. 때때로 데이터 형식이 변경됩니다.

BDFL과 CPython 개발자는 놀랍도록 지능적인 사람들로 CPython이 그러한 시나리오에서 탁월한 성능을 발휘할 수 있도록 도와주었습니다. 다음은 뻔뻔한 블로그 플러그입니다 : http://www.hydrogen18.com/blog/unpickling-buffers.html . CPython에서 파생되고 전체 C 모듈 인터페이스를 유지하는 Stackless를 사용하고 있습니다. 이 경우 PyPy를 사용하는 이점을 찾지 못했습니다.


답변

Q : PyPy가 CPython과 비교할 때 이러한 큰 과제 (속도, 메모리 소비, 병렬 처리)를 해결할 수 있다면, 더 넓은 채택을 방해하는 약점은 무엇입니까?

A : 첫째, PyPy 팀이 일반적으로 속도 문제 해결할 수 있다는 증거는 거의 없습니다 . 장기적인 증거는 PyPy가 CPython보다 느린 특정 Python 코드를 실행한다는 것을 보여 주며이 단점은 PyPy에 매우 깊이 뿌리 박힌 것 같습니다.

둘째, PyPy의 현재 버전은 다소 큰 경우 CPython보다 훨씬 많은 메모리를 소비합니다. PyPy는 아직 메모리 소비 문제를 해결하지 못했습니다.

PyPy가 언급 된 큰 과제를 해결하고 일반적 으로 CPython보다 더 빠르고, 메모리가 부족하고, 병렬 처리에 더 친숙한 지 여부는 단기적으로 해결할 수없는 공개 된 질문입니다. 어떤 사람들은 PyPy가 모든 경우에 CPython 2.7 및 3.3을 지배 할 수 있는 일반적인 솔루션 을 제공 할 수 없을 것이라고 내기하고 있습니다 .

의심의 여지가있는 PyPy가 일반적으로 CPython보다 나은 경우, 더 광범위한 채택에 영향을 미치는 주요 약점은 CPython과의 호환성입니다. CPython이 더 넓은 범위의 CPU 및 OS에서 실행된다는 사실과 같은 문제도 있지만 이러한 문제는 PyPy의 성능 및 CPython 호환성 목표와 비교할 때 훨씬 덜 중요합니다.


Q : CPython을 PyPy로 대체 할 수없는 이유는 무엇입니까?

A : PyPy는 CPython과 100 % 호환되지 않으므로 CPython을 시뮬레이션하지 않습니다. 일부 프로그램은 C 바인딩, Python 객체 및 메소드의 C 구현 또는 CPython 가비지 수집기의 증가 특성과 같이 PyPy에없는 CPython의 고유 한 기능에 여전히 의존 할 수 있습니다.


답변

CPython에는 참조 계산 및 가비지 콜렉션이 있으며 PyPy에는 가비지 콜렉션 만 있습니다.

따라서 객체는 이전에 삭제되는 경향이 있으며 __del__CPython에서보다 예측 가능한 방식으로 호출됩니다. 일부 소프트웨어는이 동작에 의존하므로 PyPy로 마이그레이션 할 준비가되지 않았습니다.

일부 다른 소프트웨어는 두 가지 모두에서 작동하지만 사용하지 않는 객체는 일찍 해제되므로 CPython에서는 메모리를 덜 사용합니다. (이것이 얼마나 중요한지, 그리고 다른 구현 세부 사항이 메모리 사용에 영향을 미치는 것을 나타내는 측정은 없습니다.)