Как вы получаете PyPy, Django и PostgreSQL для совместной работы?

89

Какую вилку или комбинацию пакетов нужно использовать, чтобы PyPy, Django и PostgreSQL играли вместе?

Я знаю, что PyPy и Django играют хорошо вместе, но я менее уверен в PyPy и PostgreSQL. Я вижу, что Алекс Гейнор сделал вилку PyPy под названием pypy-postgresql. Я также знаю, что некоторые люди используют psycopg2-ctypes.

Есть ли разница между этими вилами? Или мы должны использовать стабильный 1.9 PyPy и использовать psycopg2-ctypes? Использование параметров ctypes может повредить производительность, см. Комментарий ниже.

Кроме того, кто-нибудь испытал какие-либо подводные камни с использованием PyPy с pyscopg2? Кажется, достаточно легко вернуться на CPython, если что-то не работает правильно, но в основном я ищу вещи, которые программист может сделать заблаговременно, чтобы подготовиться.

Я огляделся, не похоже, что psycopg2 работает изначально с PyPy. Хотя psycopg2-ctypes, похоже, работает для некоторых людей, было обсуждение pypy-dev. Я работаю над Windows, и я не думаю, что psycopg2-ctypes готов к Windows, к сожалению.

  • 8
    Есть хороший разговор Алекса из Djangocon Europe 2011, где он также рассказывает о проблемах postgres: blip.tv/djangocon-europe-2011/…
  • 3
    Кстати, вызов кода c из PyPy все еще намного медленнее, чем использование чистых модулей python. Таким образом, вы, вероятно, не получите никаких преимуществ от запуска Django + psycopg2 через PyPy. Вы можете переписать psycopg2 в RPython или использовать CPython и оптимизировать важные части вашего приложения с помощью Cython .
Показать ещё 4 комментария
Теги:
psycopg2
pypy

2 ответа

29
Лучший ответ

psycopg2cffi (Обновлено 2015)

psycopg2cffi - это еще одна замена, совместимая с psycopg2, и должна обеспечивать лучшую производительность PostgreSQL с помощью PyPy. Добавьте это в свой 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-friendly ваш код вообще и какая часть времени вы фактически тратите на запуск кода Python. И, возможно, PyPy только что улучшился с тех пор.

и я не думаю, что psycopg2-ctypes готов для Windows еще

Я не пробовал это, но ctypes не зависит от платформы. AFAICT вам просто нужно убедиться, что библиотека libpq.dll загружается (находится в каталоге в вашей переменной среды PATH или в локальном каталоге), и она должна работать на Windows так же, как в Linux.

PyPy-PostgreSQL

Я вижу, что Алекс Гейнор сделал вилку PyPy под названием pypy-postgresql.

Я не думаю, что это хороший выбор в долгосрочной перспективе. Филиал не обновлялся более года, и мои попытки его создания потерпели неудачу. И, кажется, неправильно в любом случае жестко закодировать драйвер PostgreSQL в интерпретаторе.

Я считаю, что нет никаких двоичных файлов pypy-postgresql, поэтому, если вы хотите использовать его, вам нужно будет построить всю ветку PyPy самостоятельно. Не для слабонервных: это занимает десятки минут и машина с объемом памяти не менее 4 ГБ. (Официальные инструкции: http://pypy.org/download.html#building-from-source)

Чтобы построить, вам сначала нужен источник. Если у вас установлен Mercurial, вы можете просто hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Если нет, вы можете загрузить 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"

  • 0
    Не могли бы вы добавить немного, при условии, знаете ли, о том, что может понадобиться для того, чтобы pypy-pyscopg2 работал с pypy без необходимости компилировать pypy из исходного кода?
  • 1
    Я обновил ответ с деталями о том, как далеко я получил. К сожалению, сборка прервана с ошибкой. Я помню, как провел целый день, пытаясь построить его в прошлый раз, и тоже потерпел неудачу.
16

Некоторые дополнительные ресурсы:

Ещё вопросы

Сообщество Overcoder
Наверх
Меню