64-bit aarch64 ARM architecture 지원
CFFI 모듈 관련 업데이트
PyPy 샌드박스 부활
더 빠른 성능과 더 적은 메모리를 요구하는 새로운 JSON 디코더
2019년 10월 14일, PyPy v7.2 릴리즈 소식

X축: 성능 측정을 위한 벤치마크 작업,
Y축: 실행 시간(작을 수록 우수한 성능)
이미지 출처
2019년 11월 4주차 소식부터 시작하는 주간 파이썬의 첫 번째 소식으로 어떤 주제를 고를지 고민했습니다. 그다지 특별한 뉴스가 없어보이는 11월 4주차였던지라 가장 근래의 소식에서 제일 중요하다고 판단된 뉴스를 꼽았습니다. 따라서 약간은 때 지난(?) 소식이지만 PyPy 7.2버전 릴리즈 내용을 소개할 까 합니다.
PyPy?
PyPy는 “JIT 컴파일을 지원하는 파이썬”으로서 기존의 인터프리터 방식(=소스 코드를 한꺼번에 모두 컴파일한 후 실행)과 달리 JIT 컴파일링(=소스 코드에서 실행할 부분만을 실행 시점에 골라서 컴파일한 후 실행)을 지원합니다. 마치 Java의 바이트코드 컴파일처럼 말입니다.
JIT 컴파일링은 같은 코드를 매번 해석(컴파일)할 필요가 없이 자주 쓰는 코드를 캐싱한 후 추후 호출 시 캐싱한 코드를 불러와 쓰기 때문에 속도 측면에서 유리합니다.
PyPy는 수행 작업에 따라 C로 구현한 CPython보다 더 빠르며, 파이썬 기본 인터프리터보다 최대 25배 이상 빠른 결과도 존재한다고 합니다(Python 2.7.11 x86_64, PyPy 5.1.0 x86_64 기준)(출처).

PyPy v7.2
PyPy 7.2는 Python2와 Python3에 각각 대응되는 PyPy2.7, PyPy3.6로 구성되어 있습니다.
- PyPy 2.7에 대응되는 기존 파이썬 버전: Python 2.7
- PyPy 3.6에 대응되는 기존 파이썬 버전: Python 3.6
PyPy 2.7은 CPython 2.7.13를, PyPy 3.6은 CPython 3.6.9를 지원하는 스탠다드 라이브러리를 포함하고 있습니다.
PyPy 7.2는 기존 PyPy버전과 100% 호환되며 여러 버그픽스를 포함하고 있기 때문에 기존 버전 사용자에게 이번 업데이트 설치를 강력히 권장합니다.
이번 업데이트의 특징은 아래와 같습니다.
- 64-bit aarch64 ARM architecture 지원
- CFFI 모듈 관련 업데이트
- PyPy 2.7이 CFFI 기반 _ssl 모듈을 다시 사용함
- CFFI 기반 _ssl 모듈이 cryptography 2.7을 사용하도록 업데이트 되었음
- _hashlib 모듈과 crypt(파이썬 3에서는 _crypt) 모듈이 CFFI 기반으로 변환됨
- CFFI 백엔드 1.13.0으로 업데이트
- PyPy 샌드박스 부활
- 더 빠른 성능과 더 적은 메모리를 요구하는 새로운 JSON 디코더
- JIT에 최적화된 특수한 딕셔너리를 사용
64-bit aarch64 ARM architecture 지원
이제 PyPy는 64-bit ARM으로 알려진 AArch64 플랫폼을 지원합니다. 이번에 AArch64 플랫폼이 PyPy 지원 목록에 추가되면서 PyPy는 총 6개 아키텍처를 지원합니다:
x86 (32 & 64bit), ARM (32 & 64bit), PPC64, s390x.
다음 그래프는 x86_64 리눅스 랩탑, AArch64 플랫폼에서 PyPy(7.1.1)를 사용(hg id 2417f925ce94) 했을 때 CPython(2.7.16)과의 성능을 비교한 것입니다.

Y축: CPython 대비 속도 향상배수 (1x보다 높을수록 Cpython보다 뛰어남)
CFFI 모듈 관련 업데이트
이번 CFFI 모듈 업데이트는 크게 2가지 의미가 있습니다.
- PyPy 사용자와 패키지 제작자들은 _hashlib, 와 crypt같은 라이브러리들을 업데이트 시 (cd lib_pypy; ../bin/pypy _*_build.py)를 실행하기만 하면 됩니다.
- 단일 런타임 네임스페이스를 가진 리눅스와 같은 플랫폼을 사용할 때, PyPy 자체는 더 적은 숫자의 시스템 공유 오브젝트(system shared objects: DLLs)를 필요로 하게 되었기 때문에, 서로 다른 CFFI/C확장 모듈이 서로 다른 버전의 시스템 공유 오브젝트(예: 버전만 다른 동일한 DLL 오브젝트)를 PyPy로 로드할 때 충돌이 발생하지 않게 됩니다(issue 2617).
PyPy 샌드박스 부활
2019년 8월부터 이미 예고되었던 바와 같이 PyPy를 마치 리눅스의 SECCOMP과 같이 OS 레벨에서 독립하여 사용할 수 있게 만든 PyPy 샌드박스가 곧 릴리즈된다고 합니다. PyPy 샌드박스는 사용자의 파이썬 프로그램 전체를 PyPy로 실행하도록 만든 독립된 환경입니다(샌드박스의 의미를 잘 생각해보면…). PyPy 샌드박스에 관한 자세한 내용은 이곳을 참조하세요.
새로운 JSON 디코더
PyPy 7.2의 가장 큰 특징으로 보이는 새로운 JSON 디코더입니다. PyPy 7.2에서는 map과 string caching을 사용해 JSON 디코딩 성능에 큰 향상을 가져왔다고 합니다.
아래 그림들은 PyPyFULL(=PyPy 7.2에 도입된 새로운 디코더)에 비교했을 때 기존 PyPy 5.8~7.1 버전에서 사용된 JSON 디코더의 디코딩 속도 및 메모리 점유율을 나타낸 그래프입니다.
PyPyBaseline은 JSON Parser가 도입된 최초 버전인 PyPy 5.8 버전의 JSON 디코더를, PyPyKeyStringCaching과 PyPyMapNoCache은 PyPy 5.9~7.1 버전까지의 JSON 디코더를, PyPyFull은 PyPy 7.2에서 새롭게 사용된 디코더를 가리킵니다.

Y축: PyPyFULL(=PyPy 7.2의 새로운 디코더)에 비교했을 때 기존 디코더의 디코딩 시간비율
(1.0은 기존 디코더와 새 디코더의 수행 시간이 같음을 의미함. 낮을 수록 우수한 성능)

Y축: PyPyFULL(=PyPy 7.2의 새로운 디코더)에 비교했을 때 기존 디코더의 메모리 점유 비율
(1.0은 기존 디코더와 새 디코더의 메모리 점유수준이 같음을 의미함. 낮을 수록 더 적은 메모리 점유)
아래 그림들은 PyPyFull 디코더 성능/메모리 점유율과 다른 JSON 디코더 성능/ 메모리 점유율을 비교한 그림입니다.

Y축: PyPyFULL(=PyPy 7.2의 새로운 디코더)와 다른 디코더의 디코딩 수행 시간을 비교해 나타낸 비율
(1.0은 다른 디코더와 PyPy 7.2 디코더의 수행 시간이 같음을 의미함. 낮을 수록 우수한 성능)

Y축: PyPyFULL(=PyPy 7.2의 새로운 디코더)와 다른 디코더의 메모리 점유수준을 비교해 나타낸 비율
(1.0은 다른 디코더와 PyPy 7.2 디코더의 메모리 점유 수준이 같음을 의미함. 낮을 수록 우수한 성능)
위의 디코딩 시간/메모리 점유 수준 그래프로만 보자면 PyPy 7.2의 JSON 디코더는 CPython의 JSON 디코더에 비해 월등한 성능을 자랑하고 있는데요, 자세한 정보는 다음을 통해 확인하시기 바랍니다.
- 기사 작성 및 번역 출처:
https://morepypy.blogspot.com/
http://doc.pypy.org/en/latest/sandbox.html
https://speed.pypy.org/
https://namu.wiki/w/JIT
https://cffi.readthedocs.io/en/latest/