Programing

PyPy가 6.3 배 빠르면 CPython을 통해 PyPy를 사용하지 않는 이유는 무엇입니까?

crosscheck 2020. 10. 2. 21:32
반응형

PyPy가 6.3 배 빠르면 CPython을 통해 PyPy를 사용하지 않는 이유는 무엇입니까?


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

Python과 같은 동적 언어에 대해 이야기 할 때마다 속도는 가장 중요한 문제 중 하나입니다. 이를 해결하기 위해 PyPy가 6.3 배 더 빠르다고 말합니다.

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

PyPy가 이러한 큰 과제를 해결할 수 있다면 더 많은 채택을 방해하는 약점은 무엇입니까? 즉, 일반적인 Python 개발자 인 저와 같은 사람이 지금 PyPy로 전환하는 것을 방해하는 것은 무엇 입니까?


  1. 다른 사람들이 빨리 언급했듯이 PyPy 는 C 확장에 대한 지원부족합니다 . 그것은 가지고 있지만, 일반적으로보다 느린 파이썬 속도, 지원을하며 최고의 불확실한을합니다. 따라서 많은 모듈에 CPython이 필요합니다 . 사이 썬과 NumPy와는 최고 수치를 들어, 실제로 파이썬에서 속도를 필요로 대부분의 사람들은 크게 (+ 팬더, SciPy 등)들을 사용하고 있습니다. 그들은 존재하지 않거나 약하게 지원되고 느리기 때문에 빠른 Python이 필요한 사람들은 속도와 사용 편의성 모두에서 CPython을 사용하는 것이 좋습니다 .
  2. Python 3 지원 은 현재 실험적입니다. 안정에 도달했습니다! 2014 년 6 월 20 일부터 PyPy3 2.3.1-Fulcrum이 출시되었습니다 !
  3. PyPy는 때때로 많은 사람들이 Python을 사용하는 "스크립트"에 대해 실제로 더 빠르지 않습니다 . 이들은 간단하고 작은 일을하는 단기 실행 프로그램입니다. 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 % 호환되지 않기 때문에 컴파일하는 데 8GB의 램이 필요하고 이동 대상이며 고도로 실험적입니다. 여기서 cpython은 안정적이며 20 년 동안 모듈 빌더의 기본 대상입니다 (pypy에서 작동하지 않는 C 확장 포함). ), 이미 널리 배포되었습니다.

Pypy는 참조 구현이 아닐 가능성이 높지만 좋은 도구입니다.


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

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

PyPy가 안정된 상태가되면 더 널리 사용되기 시작할 가능성이 있다고 생각합니다. 나는 또한 파이썬이 C 기반에서 벗어나는 것이 좋을 것이라고 생각합니다. 그러나 그것은 한동안 일어나지 않을 것입니다. PyPy는 사용자가 원하는 모든 작업을 수행 할 수있을만큼 자체적으로 거의 유용한 임계 값에 도달하지 않아 사람들이 공백을 메우도록 동기를 부여합니다.


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

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


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

A : 첫째, PyPy 팀이 일반적으로 속도 문제 해결할 수 있다는 증거가 거의 없습니다 . 장기적인 증거에 따르면 PyPy는 CPython보다 느리게 특정 Python 코드를 실행하며이 단점은 PyPy에 매우 깊이 뿌리를두고있는 것으로 보입니다.

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

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

If PyPy succeeds to be better than CPython in general, which is questionable, the main weakness affecting its wider adoption will be its compatibility with CPython. There also exist issues such as the fact that CPython runs on a wider range of CPUs and OSes, but these issues are much less important compared to PyPy's performance and CPython-compatibility goals.


Q: Why can't I do drop in replacement of CPython with PyPy now?

A: PyPy isn't 100% compatible with CPython because it isn't simulating CPython under the hood. Some programs may still depend on CPython's unique features that are absent in PyPy such as C bindings, C implementations of Python object&methods, or the incremental nature of CPython's garbage collector.


CPython has reference counting and garbage collection, PyPy has garbage collection only.

So objects tend to be deleted earlier and __del__ is called in a more predictable way in CPython. Some software relies on this behavior, thus they are not ready for migrating to PyPy.

Some other software works with both, but uses less memory with CPython, because unused objects are freed earlier. (I don't have any measurements to indicate how significant this is and what other implementation details affect the memory use.)


For a lot of projects, there is actually 0% difference between the different pythons in terms of speed. That is those that are dominated by engineering time and where all pythons have the same amount of library support.


To make this simple: PyPy provides the speed that's lacked by CPython but sacrifices its compatibility. Most people, however, choose Python for its flexibility and its "battery-included" feature (high compatibility), not for its speed (it's still preferred though).


I've found examples, where PyPy is slower than Python. But: Only on Windows.

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

So, if you think of PyPy, forget Windows. On Linux, you can achieve awesome accelerations. Example (list all primes between 1 and 1,000,000):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

This runs 10(!) times faster on PyPy than on Python. But not on windows. There it is only 3x as fast.


PyPy has had Python 3 support for a while, but according to this HackerNoon post by Anthony Shaw from April 2nd, 2018, PyPy3 is still several times slower than PyPy (Python 2).

For many scientific calculations, particularly matrix calculations, numpy is a better choice (see FAQ: Should I install numpy or numpypy?).

Pypy does not support gmpy2. You can instead make use of gmpy_cffi though I haven't tested its speed and the project had one release in 2014.

For Project Euler problems, I make frequent use of PyPy, and for simple numerical calculations often from __future__ import division is sufficient for my purposes, but Python 3 support is still being worked on as of 2018, with your best bet being on 64-bit Linux. Windows PyPy3.5 v6.0, the latest as of December 2018, is in beta.

참고URL : https://stackoverflow.com/questions/18946662/why-shouldnt-i-use-pypy-over-cpython-if-pypy-is-6-3-times-faster

반응형