programing

PyPy가 6.3배 빠른데 왜 PyPy over CPython을 사용하면 안 되나요?

luckcodes 2022. 9. 12. 18:41

PyPy가 6.3배 빠른데 왜 PyPy over CPython을 사용하면 안 되나요?

PyPy 프로젝트에 대해 많이 들었어요.그들은 그것이 그들의 사이트에 있는 CPython 통역기보다 6.3배 더 빠르다고 주장한다.

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

두 번째 문제는 평판이 나쁜 글로벌 인터프리터 록(GIL)이다.이를 위해 PyPy는 GIL-less Python을 제공할 수 있다고 말한다.

만약 PyPy가 이러한 큰 과제를 해결할 수 있다면, PyPy의 보급을 방해하는 약점은 무엇일까요?즉, 전형적인 Python 개발자인 저 같은 사람이 지금 PyPy로 전환하는 것을 방해하는 것은 무엇일까요?

참고: PyPy는 이 질문을 받았을 때인 2013년보다 더 성숙하고 더 나은 지원을 받고 있습니다.오래된 정보에서 결론을 도출하지 않도록 합니다.


  1. PyPy는 다른 사람들이 재빨리 언급했듯이 C 확장에 대한 지원이 미약합니다.지원 기능이 있지만, 일반적으로 피톤보다 느린 속도로 기껏해야 이상적입니다.따라서 많은 모듈이 단순히 CPython을 필요로 합니다. PyPy는 numpy를 지원하지 않습니다. 일부 확장 기능은 아직 지원되지 않습니다( 판다류 , SciPy , 등)를 변경하기 전에 지원되는 패키지 목록을 확인하십시오.목록에서 지원되지 않는 것으로 표시된 패키지가 많이 지원됩니다.
  2. Python 3 지원 현재 실험적인 상태입니다. 안정에 도달했습니다! 2014년 6월 20일 기준 Py3 2.3.1 - 풀크럼 출시!
  3. PyPy는 많은 사람들이 Python을 사용하는 "스크립트"에 대해 실제로는 더 빠르지 않을 수 있습니다.이것들은 단순하고 작은 일을 하는 단기적인 프로그램들이다.PyPy는 JIT 컴파일러이기 때문에 주요 장점은 장기 실행 시간과 간단한 유형(숫자 등)입니다.PyPy's pre-JCPython에 비해 IT 속도가 저하될 수 있습니다.
  4. 관성.PyPy로 이행하려면 재설정이 필요한 경우가 많은데, 일부 사용자나 조직에서는 이러한 작업이 너무 많습니다.

그것들이 나에게 영향을 미치는 주된 이유라고 말할 수 있다.

그 사이트는 PyPy가 CPython보다 6.3배 빠르다고 주장하지 않는다.견적 내용:

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

이것은 당신이 말한 포괄적 진술과는 매우 다른 진술이며, 당신이 그 차이를 이해한다면, 당신은 "PyPy를 사용하라"고 말할 수 없는 이유를 적어도 이해할 수 있을 것입니다.내가 트집을 잡는 것처럼 들릴지 모르지만, 왜 이 두 진술이 완전히 다른지 이해하는 것이 중요하다.

이를 분석하려면:

  • 그들이 말하는 내용은 그들이 사용한 벤치마크에만 적용됩니다.프로그램에 대한 내용은 전혀 없습니다(프로그램이 벤치마크와 완전히 동일하지 않은 경우).

  • 그 진술은 벤치마크 그룹의 평균에 관한 것이다.PyPy를 실행하면 테스트한 프로그램에서도 6.3배 향상된다는 주장은 없다.

  • PyPy가 CPython이 실행하는 모든 프로그램을 더 빨리 실행할 것이라는 주장은 없다.

pypy는 100% 호환성이 없고 컴파일하는 데 8기가의 RAM이 필요하며 cpython이 안정적인 매우 실험적이며 모듈 빌더의 기본 타깃(pypy에서 작동하지 않는 c 확장 포함)은 이미 널리 배포되어 있습니다.

Pypy는 레퍼런스 구현이 아닐 가능성이 높지만, 좋은 도구입니다.

두 번째 질문은 답변하기가 더 쉽습니다. 모든 코드가 순수 Python일 경우 기본적으로 PyPy를 드롭인 대체품으로 사용할 수 있습니다.그러나 널리 사용되는 많은 라이브러리(표준 라이브러리 중 일부 포함)는 C로 작성되고 Python 확장자로 컴파일됩니다.이 중 일부는 PyPy로 동작할 수 있고 일부는 동작할 수 없습니다.PyPy는 Python과 같은 "전방용" 도구를 제공하지만, Python의 내장은 다르기 때문에 이러한 내장과 인터페이스하는 도구는 작동하지 않습니다.

첫 번째 질문에 대해서는 첫 번째 질문에 대해 말하자면 일종의 'Catch-22'라고 생각합니다.PyPy는 속도를 높이고 다른 코드와의 상호 운용성을 높이기 위해 빠르게 발전해 왔습니다.이것은 그것을 공식적인 것보다 더 실험적인 것으로 만들었다.

PyPy가 안정 상태가 되면 더 널리 사용될 가능성이 있다고 생각합니다.Python도 C의 기반에서 벗어나면 좋을 것 같습니다.하지만 당분간 그런 일은 없을 거야.PyPy는 여러분이 원하는 모든 것을 할 수 있을 만큼 충분히 유용하게 쓰일 수 있는 임계 질량에 도달하지 못했고, 이것은 사람들이 그 공백을 메우도록 동기를 부여할 것입니다.

나는 이 주제에 대해 작은 벤치마크를 했다.다른 많은 포스터들은 호환성에 대해 좋은 점을 지적하고 있지만, 제 경험으로는 PyPy가 단지 조금씩 움직이는 것에 비해 그리 빠르지는 않습니다.Python의 많은 사용에서 Python은 실제로 두 개 이상의 서비스 간 비트를 변환하기 위해서만 존재합니다.예를 들어 데이터셋의 CPU 집약적인 분석을 수행하는 웹 애플리케이션은 많지 않습니다.대신 클라이언트로부터 몇 바이트를 가져와 데이터베이스 같은 곳에 저장한 후 나중에 다른 클라이언트에 반환합니다.데이터 형식이 변경될 수 있습니다.

BDFL과 CPython 개발자는 매우 지능적인 그룹이며, 이러한 시나리오에서 CPython이 뛰어난 성능을 발휘할 수 있도록 지원하는 관리된 사람들을 보유하고 있습니다.여기 파렴치한 블로그 플러그가 있습니다.http://www.hydrogen18.com/blog/unpickling-buffers.html. 저는 CPython에서 파생되어 완전한 C 모듈 인터페이스를 유지하는 Stackless를 사용하고 있습니다.그 경우 PyPy를 사용할 수 있는 장점을 찾을 수 없었습니다.

Q: PyPy가 CPython에 비해 이러한 큰 과제(속도, 메모리 소비량, 병렬화)를 해결할 수 있다면 PyPy의 약점은 무엇입니까?

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

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

PyPy가 CPython보다 일반적으로 빠르고, 메모리 부족하며, 병렬 처리에 더 우호적인지 여부는 단기적으로 해결할 수 없는 미해결 문제이다.일부에서는 파이파이가 모든 경우에서 CPython 2.7과 3.3을 지배할 수 있는 일반적인 솔루션을 제공할 수 없을 것이라고 장담하고 있다.

PyPy가 일반적인 CPython보다 더 나은 것으로 성공한다면, PyPy의 광범위한 채택에 영향을 미치는 주요 약점은 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에서는 더 적은 메모리를 사용합니다. (이것이 얼마나 중요한지, 메모리 사용에 어떤 다른 구현 세부 정보가 영향을 미치는지 나타내는 측정치는 없습니다.

많은 프로젝트에서 속도 면에서 실제로 다른 비단뱀들 사이에 0%의 차이가 있습니다.그것은 엔지니어링 시간이 지배하고 모든 버마왕뱀이 같은 양의 도서관을 지원하는 것입니다.

간단히 말하면:PyPy는 CPython에 없는 속도를 제공하지만 호환성은 희생합니다.그러나 대부분의 사람들은 Python의 유연성과 "배터리 포함" 기능(고호환성) 때문에 Python을 선택합니다(하지만 여전히 선호됩니다).

PyPy가 Python보다 느린 예를 찾았습니다.단, 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

따라서 PyPy에 대해 생각한다면 Windows를 사용하지 마십시오.Linux 에서는 놀라운 가속화를 실현할 수 있습니다.예 (1 ~ 1,000,000 범위의 모든 소수점 나열):

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

이것은 Python보다 PyPy에서 10배 더 빨리 실행된다.하지만 창문에서는 안 돼그것은 단지 3배 더 빠르다.

PyPy는 한동안 Python 3를 지원했지만, 2018년 4월 2일 Anthony Shaw의 HackerNoon 게시물에 따르면 PyPy3는 Python 2보다 몇 배 느립니다.

많은 과학적 계산, 특히 매트릭스 계산에서는 numpy를 선택하는 것이 좋습니다(FAQ: numpy 또는 numpy?를 참조하십시오).

Pypy는 gmpy2를 지원하지 않습니다.gmpy_cffi를 대신 사용할 수 있습니다.단, 속도는 테스트하지 않았고 프로젝트는 2014년에 한 번 출시되었습니다.

프로젝트 오일러 문제의 경우 PyPy를 자주 사용하고 간단한 수치 계산을 위해 자주 사용합니다.from __future__ import divisionPython 3 지원은 2018년 현재 진행 중이며 64비트 Linux를 사용하는 것이 가장 좋습니다.2018년 12월 현재 최신 버전인 Windows Py 3.5 v6.0은 베타 버전입니다.

지원되는 Python 버전

Python의 Zen을 예로 들자면:

가독성이 중요합니다.

예를 들어, Python 3.8은 fstring =을 도입했습니다.

Python 3.8+에는 더 중요한 기능이 있을 수 있습니다.PyPy는 현재 Python 3.8+를 지원하지 않습니다.

Python 버전의 Killer Features by Python 버전 - 오래된 Python 버전을 사용하여 놓치는 것을 더 알고 싶다면

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