Wie bringen Sie PyPy, Django und PostgreSQL zusammen?

90

Welche Gabel oder Kombination von Paketen sollte man verwenden, damit PyPy, Django und PostgreSQL gut zusammenspielen?

Ich weiß, dass PyPy und Django gut zusammen spielen, aber ich bin mir bei PyPy und PostgreSQL weniger sicher. Ich sehe, dass Alex Gaynor eine Gabel aus PyPy namens pypy-postgresql hergestellt hat . Ich weiß auch, dass einige Leute psycopg2-c-Typen verwenden .

Gibt es einen Unterschied zwischen diesen Gabeln? Oder sollten wir den stabilen 1.9 PyPy verwenden und psycopg2-c-Typen verwenden? Die Verwendung der Optionen ctypes kann die Leistung beeinträchtigen (siehe Kommentar unten).

Hat jemand irgendwelche Fallstricke bei der Verwendung von PyPy mit pyscopg2 erlebt? Es scheint einfach genug zu sein, auf CPython zurückzugreifen, wenn etwas nicht richtig funktioniert, aber meistens suche ich nach Dingen, die ein Programmierer im Voraus tun kann, um sich vorzubereiten.

Ich habe mich umgesehen, es scheint nicht, dass psycopg2 nativ mit PyPy funktioniert. Obwohl psycopg2-ctypes für einige Leute zu funktionieren scheint, gab es eine Diskussion über pypy-dev . Ich arbeite unter Windows und glaube nicht, dass psycopg2-ctypes noch für Windows bereit ist, leider.

James R.
quelle
8
Es gibt einen schönen Vortrag von Alex von der Djangocon Europe 2011, wo er auch über die Postgres-Themen spricht: blip.tv/djangocon-europe-2011/…
Bernhard Vallant
3
Übrigens ist das Aufrufen von C-Code von PyPy immer noch viel langsamer als die Verwendung von reinen Python-Modulen. Sie werden also wahrscheinlich keine Vorteile daraus ziehen, Django + psycopg2 über PyPy auszuführen. Sie können psycopg2 in RPython neu schreiben oder CPython verwenden und kritische Teile Ihrer Anwendung mit Cython optimieren .
Vladimir Protasov
Auch: bitbucket.org/alex_gaynor/pypy-postgresql (irgendwie alt ...)
jperelli
2
Einige Leute um mich herum empfehlen psycopg2ct , aber ohne Django ... Kann helfen ...
Dingo
Was ist dein Betriebssystem, Distribution, Version?
Pylover

Antworten:

33

psycopg2cffi (aktualisiert 2015)

psycopg2cffi ist ein weiterer psycopg2-kompatibler Ersatz und sollte mit PyPy die beste PostgreSQL-Leistung bieten. Fügen Sie dies zu Ihrem hinzu settings.py, um mit beiden kompatibel zu bleiben:

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

psycopg2-ctypes (2012)

Ich weiß auch, dass einige Leute psycopg2-c-Typen verwenden.

Dies ist der einfachste Weg; Um mit beiden kompatibel zu bleiben, fügen Sie einfach diesen Code in Ihren Django ein settings.py:

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

Ich habe das vor ein paar Releases getestet. Leider negiert psycopg2-ctypes meiner Erfahrung nach die geringen Leistungssteigerungen, die PyPy bietet. Aber YMMV, es hängt davon ab, wie JIT-freundlich Ihr Code im Allgemeinen ist und wie viel Zeit Sie tatsächlich damit verbringen, Python-Code auszuführen. Und vielleicht hat sich PyPy seitdem gerade verbessert.

und ich glaube nicht, dass psycopg2-ctypes noch für Windows bereit ist

Ich habe das nicht ausprobiert, aber ctypes ist plattformunabhängig. AFAICT Sie müssen nur sicherstellen, dass die libpq.dllBibliothek ladbar ist (sich in einem Verzeichnis in Ihrer PATH-Umgebungsvariablen oder in einem lokalen Verzeichnis befindet) und unter Windows genau wie unter Linux funktionieren sollte.

pypy-postgresql

Ich sehe, dass Alex Gaynor eine Gabel aus PyPy namens pypy-postgresql hergestellt hat.

Ich denke nicht, dass dies auf lange Sicht eine gute Wahl ist. Der Zweig wurde seit mehr als einem Jahr nicht mehr aktualisiert und meine Versuche, ihn zu erstellen, sind fehlgeschlagen. Und es scheint sowieso falsch, einen PostgreSQL-Treiber im Interpreter fest zu codieren.

Ich glaube, es gibt auch keine Binärdateien von pypy-postgresql. Wenn Sie es also verwenden möchten, müssen Sie den gesamten PyPy-Zweig selbst erstellen. Nichts für schwache Nerven: Es dauert mehrere zehn Minuten und eine Maschine mit mindestens 4 GB Arbeitsspeicher. (Offizielle Anweisungen: http://pypy.org/download.html#building-from-source )

Zum Erstellen benötigen Sie zunächst die Quelle. Wenn Sie Mercurial installiert haben, können Sie dies einfach tun hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Wenn nicht, können Sie die automatische ZIP-Datei "tip" herunterladen: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Öffnen Sie eine Befehlszeile, gehen Sie in das dekomprimierte Verzeichnis und dann hinein pypy/translator/goal

Wenn Sie PyPy installiert haben, wird empfohlen, dies zum Erstellen zu verwenden:

pypy translate.py -Ojit

Andernfalls:

python translate.py -Ojit

Leider endet hier mein Wissen. Ich bekomme den Fehler " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"

intgr
quelle
Könnten Sie ein wenig hinzufügen, vorausgesetzt, Sie wissen, was nötig sein könnte, damit pypy-pyscopg2 mit pypy funktioniert, ohne pypy aus dem Quellcode kompilieren zu müssen?
James R
1
Ich habe die Antwort mit Details darüber aktualisiert, wie weit ich gekommen bin. Leider wurde der Build mit einem Fehler abgebrochen. Ich erinnere mich, dass ich einen ganzen Nachmittag damit verbracht habe, das letzte Mal zum Bauen zu bringen, und auch gescheitert bin.
Intgr
16

Einige zusätzliche Ressourcen:

  • Informationen zur PyPy-Kompatibilität: DB-Adapter
  • PostgreSQL-Seite im Python-Wiki
  • psycopg2cffi von Konstantin Lopuhin:
    cffi-basierte Implementierung von psycopg2 für PyPy 2.0 und neuer
    ( Blog-Beitrag , GitHub-Repo , PyPI-Seite , Pypy-Dev-Thread )
    - dies scheint der derzeit stärkste Kandidat zu sein, aber ich habe es noch nicht getestet
  • psycopg2ct von Michael van Tellingen:
    ctypes-basierte Implementierung von psycopg2 für PyPy 1.6 und neuer
    ( GitHub-Repo , PyPI-Seite )
  • pypy-postgresql von Alex Gaynor:
    aufgegebener RPython-Port von psycopg2 als Gabel von PyPy implementiert ( Bitbucket-Repo )
  • pypq :
    "Python PostgreSQL DBAPI 2.0-kompatibler Treiber mit ctypes und libpq.so funktioniert mit PyPy"
    ( Diskussion , PyPI-Seite )
  • bpgsql :
    "Barebones-PostGreSQL-Client mit reinem Python. Meistens DB-API 2.0 (PEP 249) kompatibel. Beinhaltet ein experimentelles Django 1.0-Backend"
    ( Diskussion , Webseite , Google-Codepage )
  • pg8000 :
    "Eine DB-API 2.0-kompatible Pure-Python-Schnittstelle zur PostgreSQL-Datenbank-Engine [...] basiert nicht auf externen Bibliotheken (wie einem kompilierten Python-Modul oder der libpq-Bibliothek von PostgreSQL)"
    ( Webseite , GitHub-Repo) , PyPI-Seite )
Akaihola
quelle