Jak zmusić PyPy, Django i PostgreSQL do współpracy?


91

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.


8
Jest miłe przemówienie Alexa z Djangocon Europe 2011, w którym mówi również o problemach z postgresem: blip.tv/djangocon-europe-2011/…
Bernhard Vallant,

3
BTW, wywołanie kodu c z PyPy jest nadal znacznie wolniejsze niż przy użyciu czystych modułów Pythona. Więc prawdopodobnie nie odniesiesz żadnych korzyści z uruchamiania Django + psycopg2 przez PyPy. Możesz przepisać psycopg2 w RPython lub użyć CPython i zoptymalizować krytyczne części aplikacji za pomocą Cythona .
Vladimir Protasov


2
Niektórzy ludzie wokół mnie polecają psycopg2ct , ale bez django ... Może może pomóc ...
Dingo

jaki jest twój system operacyjny, dystrybucja, wersja?
pylover

Odpowiedzi:


33

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.pyaby zachować zgodność z obydwoma:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2cffi
    from psycopg2cffi import compat
    compat.register()

psycopg2-ctypes (2012)

Wiem również, że niektórzy ludzie używają psycopg2-ctypes.

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ł.

i nie sądzę, że psycopg2-ctypes jest jeszcze gotowy na Windows

Nie próbowałem tego, ale ctypes jest niezależny od platformy. AFAICT, musisz tylko upewnić się, że libpq.dllbiblioteka 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

Widzę, że Alex Gaynor stworzył widelec PyPy o nazwie 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.zip

Otwó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


Czy mógłbyś dodać trochę, pod warunkiem, że wiesz, co może być potrzebne, aby pypy-pyscopg2 działał z pypy bez konieczności kompilowania pypy ze źródła?
James R

1
Zaktualizowałem odpowiedź o szczegóły dotyczące tego, jak daleko zaszedłem. Niestety kompilacja została przerwana z błędem. Pamiętam, że spędziłem całe popołudnie próbując zmusić go do zbudowania ostatnim razem, ale też mi się nie udało.
intgr

16

Dodatkowe zasoby:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.