Comment faire fonctionner PyPy, Django et PostgreSQL?


90

Quel fork, ou combinaison de packages faut-il utiliser pour que PyPy, Django et PostgreSQL fonctionnent bien ensemble?

Je sais que PyPy et Django jouent bien ensemble, mais je suis moins sûr de PyPy et PostgreSQL. Je vois qu'Alex Gaynor a fait un fork de PyPy appelé pypy-postgresql . Je sais aussi que certaines personnes utilisent psycopg2-ctypes .

Y a-t-il une différence entre ces fourches? Ou devrions-nous utiliser la version stable 1.9 PyPy et utiliser psycopg2-ctypes? L'utilisation des options ctypes pourrait nuire aux performances, voir le commentaire ci-dessous.

En outre, quelqu'un a-t-il rencontré des pièges lors de l'utilisation de PyPy avec pyscopg2? Il semble assez facile de se rabattre sur CPython si quelque chose ne fonctionne pas correctement, mais je recherche surtout des choses qu'un programmeur peut faire à l'avance pour se préparer.

J'ai regardé autour de moi, il ne semble pas que psycopg2 fonctionne nativement avec PyPy. Bien que psycopg2-ctypes semble fonctionner pour certaines personnes, il y a eu une discussion sur pypy-dev . Je travaille sous Windows et je ne pense pas que psycopg2-ctypes soit encore prêt pour Windows, malheureusement.


8
Il y a une belle conférence d'Alex du Djangocon Europe 2011, où il parle également des problèmes postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant

3
BTW, appeler du code c depuis PyPy est encore beaucoup plus lent que d'utiliser des modules python purs. Vous n'obtiendrez donc probablement aucun avantage à exécuter Django + psycopg2 via PyPy. Vous pouvez réécrire psycopg2 dans RPython ou utiliser CPython et optimiser les parties critiques de votre application avec Cython .
Vladimir Protasov


2
Certaines personnes autour de moi recommandent psycopg2ct , mais sans django ... Peut aider ...
Dingo

quel est votre système d'exploitation, distribution, version?
pylover

Réponses:


33

psycopg2cffi (mis à jour 2015)

psycopg2cffi est un autre remplaçant compatible psycopg2 et devrait fournir les meilleures performances PostgreSQL avec PyPy. Ajoutez ceci à votre settings.pypour rester compatible avec les deux:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2cffi
    from psycopg2cffi import compat
    compat.register()

psycopg2-ctypes (2012)

Je sais aussi que certaines personnes utilisent psycopg2-ctypes.

C'est le moyen le plus simple; pour rester compatible avec les deux, ajoutez simplement ce code dans votre Django settings.py:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2-ctypes
    from psycopg2ct import compat
    compat.register()

J'ai testé cela il y a quelques versions; Malheureusement, d'après mon expérience, psycopg2-ctypes annule les petits gains de performances offerts par PyPy. Mais YMMV, cela dépend de la compatibilité de votre code avec JIT en général et de la fraction de temps que vous passez réellement à exécuter du code Python. Et peut-être que PyPy vient de s'améliorer depuis.

et je ne pense pas que psycopg2-ctypes soit encore prêt pour Windows

Je n'ai pas essayé cela, mais ctypes est indépendant de la plate-forme. AFAICT vous devez juste vous assurer que la libpq.dllbibliothèque est chargeable (située dans un répertoire de votre variable d'environnement PATH ou du répertoire local) et qu'elle devrait fonctionner sous Windows comme sous Linux.

pypy-postgresql

Je vois qu'Alex Gaynor a fait un fork de PyPy appelé pypy-postgresql.

Je ne pense pas que ce soit un bon choix à long terme. La branche n'a pas été mise à jour depuis plus d'un an et mes tentatives pour la construire ont échoué. Et il semble de toute façon erroné de coder en dur un pilote PostgreSQL dans l'interpréteur.

Je crois qu'il n'y a pas non plus de binaires de pypy-postgresql, donc si vous voulez l'utiliser, vous devrez créer vous-même toute la branche PyPy. Pas pour les âmes sensibles: cela prend des dizaines de minutes et une machine avec au moins 4 Go de mémoire. (Instructions officielles: http://pypy.org/download.html#building-from-source )

Pour construire, vous avez d'abord besoin de la source. Si Mercurial est installé, vous pouvez simplement hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Sinon, vous pouvez télécharger le fichier zip automagic "tip": https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Ouvrez une ligne de commande, allez dans le répertoire décompressé, puis à l'intérieur pypy/translator/goal

Si PyPy est installé, il est recommandé de l'utiliser pour la construction:

pypy translate.py -Ojit

Autrement:

python translate.py -Ojit

Malheureusement, c'est là que mes connaissances s'arrêtent. J'obtiens l'erreur " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


Pourriez-vous ajouter un peu, à condition, vous savez, ce qu'il faudrait pour que pypy-pyscopg2 fonctionne avec pypy sans avoir besoin de compiler pypy à partir des sources?
James R

1
J'ai mis à jour la réponse avec des détails sur le chemin parcouru. Malheureusement, la construction a été abandonnée avec une erreur. Je me souviens avoir passé un après-midi entier à essayer de le faire construire la dernière fois, et j'ai échoué aussi.
intgr

16

Quelques ressources supplémentaires:

  • Informations de compatibilité PyPy: adaptateurs DB
  • Page PostgreSQL sur le wiki Python
  • psycopg2cffi par Konstantin Lopuhin:
    CFFI mise en œuvre sur la base de psycopg2 pour PyPy 2.0 et plus récent
    ( blog , repo GitHub , la page PyPI , fil pypy-dev )
    - cela ressemble à l'heure actuelle meilleur candidat, mais je n'ai pas encore testé
  • psycopg2ct par Michael van Tellingen:
    implémentation basée sur ctypes de psycopg2 pour PyPy 1.6 et plus récent
    ( dépôt GitHub , page PyPI )
  • pypy-postgresql par Alex Gaynor:
    port RPython abandonné de psycopg2 implémenté comme un fork de PyPy ( dépôt Bitbucket )
  • pypq :
    "Pilote compatible Python PostgreSQL DBAPI 2.0 utilisant ctypes et libpq.so, fonctionne avec PyPy"
    ( discussion , page PyPI )
  • bpgsql :
    ". Barebones client PostGreSQL pur python DB-API La plupart du temps 2.0 (PEP 249) compatible comprend un back - end Django 1.0 expérimental"
    ( discussion , page Web , la page Google Code )
  • pg8000 :
    "une interface Pure-Python compatible DB-API 2.0 avec le moteur de base de données PostgreSQL [...] ne repose sur aucune bibliothèque externe (comme un module python compilé ou la bibliothèque libpq de PostgreSQL)"
    ( page web , dépôt GitHub , Page PyPI )
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.