PyPy를 위한 확장 모듈 작성하기¶
이 문서는 PyPy 파이썬 인터프리터를 외부 라이브러리와 연동하는 방법을 설명하고자 합니다.
현재, PyPy 파이썬 인터프리터에 서드파티 모듈을 제공하는 방법에는 다음과 같은 가능성들이 있습니다(PyPy에서 사용하기에 가장 직접적으로 유용한 순서부터 가장 지저분한 순서까지):
- 순수 Python으로 작성하고 CFFI를 사용하십시오.
- 순수 Python으로 작성하고 ctypes를 사용합니다.
- C++로 작성하고 Cling을 사용하는 cppyy를 통해 바인딩합니다.
- RPython 혼합 모듈(Mixed Modules)로 작성하십시오.
CFFI¶
CFFI는 권장되는 방법입니다. C 라이브러리에 접근하는 순수 Python 코드를 작성하는 방법입니다. 핵심 아이디어는 C에 대한 ABI 또는 API 수준 접근을 지원하는 것입니다 — 그래서 C 구조체의 정확한 필드 순서나 모든 상수의 숫자 값과 같은 세부사항에 의존하지 않고도 C 라이브러리에 안전하게 접근할 수 있습니다. CPython(별도로 python -mpip install cffi로 설치)과 PyPy(기본으로 포함됨) 모두에서 동작합니다.
PyPy의 JIT은 CFFI로 C 함수를 호출하거나 C 포인터를 조작하는 Python 코드에 대해 상당히 합리적인 성능을 보입니다. (PyPy 2.2.1 기준으로 아직 개선의 여지는 있지만, 이미 훌륭한 수준입니다.)
문서는 여기에서 확인하십시오.
CTypes¶
PyPy의 ctypes 모듈의 목표는 CPython ctypes버전과 최대한 호환되는 것입니다. pyglet과 같은 대규모 예제에서도 동작합니다. PyPy의 구현은 CPython과 엄격하게 100% 호환되지는 않지만, 대부분의 경우에는 충분히 가깝습니다. 더 많은(다만 오래된) 정보는 여기에서 확인할 수 있습니다. 또한, ctypes의 성능은 CFFI만큼 좋지 않습니다.
PyPy는 _rawffi와 _rawffi.alt라는 두 개의 내장 모듈을 중심으로 순수 파이썬 코드로 ctypes를 구현하며, 이 모듈들은 C 라이브러리 libffi에 대한 매우 저수준의 바인딩을 제공합니다. 오늘날에는 이 두 모듈을 직접 사용하는 것이 권장되지 않습니다.
cppyy¶
C++의 경우, _cppyy_는 PyPy와 CPython 모두에서 사용할 수 있는 자동 바인딩 생성기입니다. _cppyy_는 C++ 헤더 파일의 선언에 의존하여 Python에 대응하는 클래스, 함수, 변수 등을 동적으로 생성합니다. 대규모 프로그램에서 사용할 수 있도록 설계되었으며, 최신 C++을 지원합니다. PyPy에서는 내장된 _cppyy 모듈을 활용하여, JIT가 언어 간 오버헤드 대부분을 제거할 수 있게 합니다.
설치하려면 <pypy> -mpip install cppyy를 실행합니다. 자세한 내용은 full documentation에서 확인할 수 있습니다.
RPython 혼합 모듈(Mixed Modules)¶
이것은 PyPy에서 내장 확장 모듈을 작성하는 내부적인 방법입니다. 이는 어떤 서드파티 모듈도 사용할 수 없습니다: 확장 모듈은 독립적으로 로드 가능한 DLL이 아니라 내장(built-in)되어 있는 것이기 때문입니다.
이것은 특수한 경우를 위해 예약되어 있습니다: 예를 들어 JIT의 세부 사항에 직접 접근할 수 있게 해주어, 사용자 코드와의 상호작용을 조정할 수 있게 합니다. 이것이 numpy 모듈이 개발되고 있는 방식입니다.