PyPy, Django 및 PostgreSQL이 함께 작동하도록하려면 어떻게해야합니까?


91

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 용으로 준비되어 있지 않다고 생각합니다.


8
Djangocon Europe 2011에서 Alex의 멋진 강연이 있습니다. 여기서 그는 postgres 문제에 대해서도 이야기합니다. blip.tv/djangocon-europe-2011/…
Bernhard Vallant

3
BTW, PyPy에서 c 코드를 호출하는 것은 순수한 파이썬 모듈을 사용하는 것보다 훨씬 느립니다. 따라서 PyPy를 통해 Django + psycopg2를 실행해도 아무런 이점도 얻지 못할 것입니다. RPython 에서 psycopg2를 다시 작성 하거나 CPython을 사용하고 Cython으로 애플리케이션의 중요한 부분을 최적화 할 수 있습니다 .
Vladimir Protasov


2
내 주위에 어떤 사람들은 추천 psycopg2ct을 하지만, 장고없이 ... 월은 도움이 될 수 있습니다 ...
딩고

OS, 배포판, 버전은 무엇입니까?
pylover 2012-06-17

답변:


33

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를 컴파일 할 필요없이 pypy-pyscopg2가 pypy와 함께 작동하도록하는 데 필요한 사항에 대해 조금만 추가 할 수 있습니까?
James R

1
나는 얼마나 멀리 왔는지에 대한 세부 정보로 답변을 업데이트했습니다. 불행히도 빌드가 오류와 함께 중단되었습니다. 나는 마지막 시간을 만들기 위해 오후 내내 시간을 보냈고 실패한 것을 기억합니다.
intgr 2012-07-02

16

몇 가지 추가 리소스 :

  • 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 페이지 )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.