Як змусити PyPy, Django та PostgreSQL працювати разом?


90

Який форк або комбінацію пакетів слід використовувати, щоб 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 ... Може допомогти ...
Dingo

який ваш ОС, розповсюдження, версія?
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-файл "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-pyscopg2 працював з pypy без необхідності компілювати pypy з джерела?
James R,

1
Я оновив відповідь деталями про те, як далеко я зайшов. На жаль, збірка перервана з помилкою. Я пам’ятаю, як цілий полудень намагався змусити його побудувати востаннє, і теж не вдалося.
intgr

16

Деякі додаткові ресурси:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.