[python] PyPy, Django 및 PostgreSQL이 함께 작동하도록하려면 어떻게해야합니까?
PyPy, Django 및 PostgreSQL이 함께 잘 작동하도록하려면 어떤 포크 또는 패키지 조합을 사용해야합니까?
나는 PyPy와 Django가 함께 잘 작동한다는 것을 알고 있지만 PyPy와 PostgreSQL에 대해서는 확신하지 못합니다. Alex Gaynor가 pypy-postgresql 이라는 PyPy 포크를 만들었습니다 . 나는 또한 어떤 사람들이 psycopg2-ctypes를 사용하고 있다는 것을 알고 있습니다.
이 포크들 사이에 차이점이 있습니까? 아니면 안정적인 1.9 PyPy를 사용하고 psycopg2-ctypes를 사용해야합니까? ctypes 옵션을 사용하면 성능이 저하 될 수 있습니다. 아래 설명을 참조하십시오.
또한 pyscopg2와 함께 PyPy를 사용하여 함정을 경험 한 사람이 있습니까? 무언가가 제대로 작동하지 않으면 CPython으로 돌아가는 것이 충분히 쉬워 보이지만 대부분은 프로그래머가 준비하기 위해 미리 할 수있는 일을 찾고 있습니다.
주위를 둘러 보았는데 psycopg2가 PyPy에서 기본적으로 작동하지 않는 것 같습니다. psycopg2-ctypes가 어떤 사람들에게는 효과가있는 것 같지만 pypy-dev 에 대한 토론이 있었습니다 . 저는 Windows에서 작업하지만 psycopg2-ctypes는 아직 Windows 용으로 준비되어 있지 않다고 생각합니다.
답변
psycopg2cffi (2015 년 업데이트)
psycopg2cffi 는 또 다른 psycopg2 호환 대체품이며 PyPy에서 최고의 PostgreSQL 성능을 제공해야합니다. settings.py
두 가지 모두와의 호환성을 유지 하려면 이것을 추가하십시오 .
try:
import psycopg2
except ImportError:
# Fall back to psycopg2cffi
from psycopg2cffi import compat
compat.register()
psycopg2-ctypes (2012)
나는 또한 어떤 사람들이 psycopg2-ctypes를 사용하고 있다는 것을 알고 있습니다.
이것이 가장 쉬운 방법입니다. 둘 다 호환성을 유지하려면 Django에 settings.py
다음 코드를 추가하십시오 .
try:
import psycopg2
except ImportError:
# Fall back to psycopg2-ctypes
from psycopg2ct import compat
compat.register()
나는 이것을 몇 가지 릴리스 전에 테스트했습니다. 슬프게도 내 경험상 psycopg2-ctypes는 PyPy가 제공하는 작은 성능 향상을 무효화합니다. 그러나 YMMV는 일반적으로 코드가 JIT에 얼마나 친숙하고 실제로 Python 코드를 실행하는 데 소요되는 시간에 따라 다릅니다. 그리고 아마도 PyPy는 그 이후로 개선되었을 것입니다.
psycopg2-ctypes가 아직 Windows 용으로 준비되어 있지 않다고 생각합니다.
나는 이것을 시도하지 않았지만 ctypes는 플랫폼 독립적입니다. AFAICT는 libpq.dll
라이브러리가로드 가능한지 (PATH 환경 변수 또는 로컬 디렉터리의 디렉터리에 있음) 확인해야하며 Linux에서와 마찬가지로 Windows에서 작동해야합니다.
pypy-postgresql
Alex Gaynor가 pypy-postgresql이라는 PyPy 포크를 만들었습니다.
나는 이것이 장기적으로 좋은 선택이라고 생각하지 않습니다. 브랜치가 1 년 이상 업데이트되지 않았고 구축하려는 시도가 실패했습니다. 어쨌든 인터프리터에서 PostgreSQL 드라이버를 하드 코딩하는 것은 잘못된 것 같습니다.
나는 pypy-postgresql에도 바이너리가 없다고 생각하므로 사용하려면 전체 PyPy 브랜치를 직접 빌드해야합니다. 약한 마음을위한 것이 아닙니다. 최소 4GB의 메모리를 가진 기계와 수십 분이 걸립니다. (공식 지침 : http://pypy.org/download.html#building-from-source )
빌드하려면 먼저 소스가 필요합니다. Mercurial을 설치 한 경우 간단히 hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql
. 그렇지 않은 경우 automagic “tip”zip 파일을 다운로드 할 수 있습니다. https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip
명령 줄을 열고 압축이 풀린 디렉터리로 이동 한 다음 pypy/translator/goal
PyPy가 설치되어있는 경우 빌드에 사용하는 것이 좋습니다.
pypy translate.py -Ojit
그렇지 않으면:
python translate.py -Ojit
슬프게도 이것이 내 지식이 끝나는 곳입니다. ” BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG
” 오류가 발생합니다.
답변
몇 가지 추가 리소스 :
- PyPy 호환성 정보 : DB 어댑터
- Python 위키의 PostgreSQL 페이지
- psycopg2cffi 콘스탄틴 Lopuhin의 :
PyPy 2.0 및 최신위한 psycopg2의 cffi 기반 구현
( 블로그 게시물 , GitHub의에 REPO , PyPI 페이지 , pypy-dev에 스레드 )
– 현재 가장 강력한 후보 등이 외모,하지만 난 아직 테스트하지 않았습니다 - psycopg2ct by Michael van Tellingen :
ctypes based implementation of psycopg2 for PyPy 1.6 and newer
( GitHub repo , PyPI page ) - Alex Gaynor의 pypy-postgresql :
PyPy의 포크로 구현 된 psycopg2의 버려진 RPython 포트 ( Bitbucket repo ) - pypq :
“ctypes 및 libpq.so를 사용하는 Python PostgreSQL DBAPI 2.0 호환 드라이버, PyPy와 함께 작동”
( 토론 , PyPI 페이지 ) - bpgsql :
“Barebones pure-python PostGreSQL 클라이언트. 대부분 DB-API 2.0 (PEP 249) 호환. 실험적인 Django 1.0 백엔드 포함”
( 토론 , 웹 페이지 , Google 코드 페이지 ) - pg8000 :
“PostgreSQL 데이터베이스 엔진에 대한 DB-API 2.0 호환 Pure-Python 인터페이스 […]는 외부 라이브러리 (예 : 컴파일 된 Python 모듈 또는 PostgreSQL의 libpq 라이브러리)에 의존하지 않습니다.”
( 웹 페이지 , GitHub 저장소 , PyPI 페이지 )