Jakiego rozwidlenia lub kombinacji pakietów należy użyć, aby PyPy, Django i PostgreSQL działały dobrze razem?
Wiem, że PyPy i Django grają ze sobą dobrze, ale jestem mniej pewien co do PyPy i PostgreSQL. Widzę, że Alex Gaynor stworzył widelec PyPy o nazwie pypy-postgresql . Wiem również, że niektórzy ludzie używają psycopg2-ctypes .
Czy jest różnica między tymi widelcami? A może powinniśmy użyć stabilnego 1.9 PyPy i użyć psycopg2-ctypes? Korzystanie z opcji ctypes może zaszkodzić wydajności, patrz komentarz poniżej.
Czy ktoś napotkał jakieś pułapki związane z używaniem PyPy z pyscopg2? Wydaje się, że dość łatwo jest wrócić do CPythona, jeśli coś nie działa dobrze, ale przede wszystkim szukam rzeczy, które programista może zrobić z wyprzedzeniem, aby się przygotować.
Rozejrzałem się, nie wygląda na to, że psycopg2 działa natywnie z PyPy. Chociaż wydaje się, że psycopg2-ctypes działa u niektórych osób, odbyła się dyskusja na temat pypy-dev . Pracuję w systemie Windows i niestety nie sądzę, aby psycopg2-ctypes był jeszcze gotowy na system Windows.
Odpowiedzi:
psycopg2cffi (zaktualizowany w 2015 r.)
psycopg2cffi to kolejny zamiennik kompatybilny z psycopg2 i powinien zapewniać najlepszą wydajność PostgreSQL z PyPy. Dodaj to do swojego,
settings.py
aby zachować zgodność z obydwoma:try: import psycopg2 except ImportError: # Fall back to psycopg2cffi from psycopg2cffi import compat compat.register()
psycopg2-ctypes (2012)
To jest najłatwiejszy sposób; aby zachować zgodność z obydwoma, po prostu dodaj ten kod w swoim Django
settings.py
:try: import psycopg2 except ImportError: # Fall back to psycopg2-ctypes from psycopg2ct import compat compat.register()
Przetestowałem to kilka wydań temu; Niestety z mojego doświadczenia wynika, że psycopg2-ctypes neguje niewielki wzrost wydajności zapewniany przez PyPy. Ale YMMV, to zależy od tego, jak przyjazny dla JIT jest twój kod ogólnie i jaki ułamek czasu faktycznie spędzasz na uruchamianiu kodu Pythona. I może od tego czasu PyPy właśnie się poprawił.
Nie próbowałem tego, ale ctypes jest niezależny od platformy. AFAICT, musisz tylko upewnić się, że
libpq.dll
biblioteka jest ładowalna (znajduje się w katalogu w twojej zmiennej środowiskowej PATH lub katalogu lokalnym) i powinna działać w systemie Windows tak jak w Linuksie.pypy-postgresql
Nie sądzę, żeby to był dobry wybór na dłuższą metę. Oddział nie był aktualizowany od ponad roku, a moje próby jego zbudowania nie powiodły się. I wydaje się, że błędne jest zakodowanie sterownika PostgreSQL w interpreterze.
Uważam, że nie ma też plików binarnych pypy-postgresql, więc jeśli chcesz go użyć, musisz sam zbudować całą gałąź PyPy. Nie dla osób o słabym sercu: zajmuje to kilkadziesiąt minut i maszyna z co najmniej 4 GB pamięci. (Oficjalne instrukcje: http://pypy.org/download.html#building-from-source )
Aby zbudować, najpierw potrzebujesz źródła. Jeśli masz zainstalowany Mercurial, możesz po prostu
hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql
. Jeśli nie, możesz pobrać automagiczny plik zip ze wskazówkami: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zipOtwórz wiersz poleceń, przejdź do rozpakowanego katalogu, a następnie do środka
pypy/translator/goal
Jeśli masz zainstalowane PyPy, zalecamy użycie go do budowania:
pypy translate.py -Ojit
Inaczej:
python translate.py -Ojit
Niestety na tym kończy się moja wiedza. Otrzymuję błąd „
BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG
”źródło
Dodatkowe zasoby:
implementacja psycopg2 oparta na cffi dla PyPy 2.0 i nowszych
( post na blogu , repozytorium GitHub , strona PyPI , wątek pypy-dev )
- wygląda na to, że obecnie jest to najsilniejszy kandydat, ale jeszcze tego nie testowałem
implementacja psycopg2 oparta na ctypes dla PyPy 1.6 i nowszych
( repozytorium GitHub , strona PyPI )
porzucony port RPython psycopg2 zaimplementowany jako fork PyPy ( repozytorium Bitbucket )
"Sterownik zgodny z Python PostgreSQL DBAPI 2.0 korzystający z ctypes i libpq.so, współpracuje z PyPy"
( dyskusja , strona PyPI )
". Barebone pure-python PostGreSQL klient Głównie DB-API 2.0 (PEP 249) zgodny Zawiera eksperymentalną Django 1.0 backend"
( dyskusja , strona internetowa , Google Code strona )
"interfejs Pure-Python zgodny z DB-API 2.0 do silnika bazy danych PostgreSQL [...] nie polega na żadnych zewnętrznych bibliotekach (takich jak skompilowany moduł Pythona lub biblioteka libpq PostgreSQL)"
( strona internetowa , repozytorium GitHub , Strona PyPI )
źródło