Как заставить PyPy, Django и PostgreSQL работать вместе?

91

Какую вилку или комбинацию пакетов следует использовать, чтобы 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 .
Владимир Протасов
Также: bitbucket.org/alex_gaynor/pypy-postgresql (вроде старого ...)
jperelli
2
Некоторые люди вокруг меня рекомендуют psycopg2ct , но без django ... Может, может помочь ...
Динго
какая у вас ОС, дистрибутив, версия?
pylover

Ответы:

33

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-дружественный ваш код в целом, и какую долю времени вы фактически тратите на запуск кода 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"

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

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

  • Информация о совместимости PyPy: адаптеры БД
  • Страница PostgreSQL в вики Python
  • psycopg2cffi от Константина Лопухина:
    реализация psycopg2 на основе cffi для PyPy 2.0 и новее
    ( сообщение в блоге , репозиторий GitHub , страница PyPI , ветка pypy-dev )
    - это выглядит как самый сильный кандидат в настоящее время, но я еще не тестировал его
  • psycopg2ct от Майкла ван Теллингена:
    реализация psycopg2 на основе ctypes для PyPy 1.6 и новее
    ( репозиторий GitHub , страница PyPI )
  • pypy-postgresql от Alex Gaynor:
    заброшенный порт Psycopg2 на RPython, реализованный как форк PyPy ( репозиторий Bitbucket )
  • pypq :
    «Python PostgreSQL DBAPI 2.0 совместимый драйвер, использующий ctypes и libpq.so, работает с PyPy»
    ( обсуждение , страница PyPI )
  • bpgsql :
    «Клиент PostGreSQL на чистом питоне Barebones. В основном совместим с DB-API 2.0 (PEP 249). Включает экспериментальный серверный модуль Django 1.0»
    ( обсуждение , веб-страница , страница кода Google )
  • pg8000 :
    «совместимый с DB-API 2.0 интерфейс Pure-Python для механизма базы данных PostgreSQL [...] не полагается на какие-либо внешние библиотеки (такие как скомпилированный модуль python или библиотека libpq PostgreSQL)»
    ( веб-страница , репозиторий GitHub , Страница PyPI )
акайхола
источник