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

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

2 ответа

Решение

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)

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

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

Другие вопросы по тегам