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

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

Я знаю, что PyPy и Django хорошо играют вместе, но я менее уверен в PyPy и PostgreSQL. Я вижу, что Алекс Гейнор сделал вилку Пайпи под названием 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#building-from-source)

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


дополнительные материалы:

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