Come riesci a far lavorare insieme PyPy, Django e PostgreSQL?


90

Quale fork o combinazione di pacchetti si dovrebbe usare per far funzionare PyPy, Django e PostgreSQL insieme?

So che PyPy e Django suonano bene insieme, ma sono meno sicuro di PyPy e PostgreSQL. Vedo che Alex Gaynor ha creato un fork di PyPy chiamato pypy-postgresql . So anche che alcune persone usano psycopg2-ctypes .

C'è una differenza tra queste forcelle? O dovremmo usare lo stabile 1.9 PyPy e usare psycopg2-ctypes? L'utilizzo delle opzioni ctypes potrebbe influire negativamente sulle prestazioni, vedere il commento di seguito.

Inoltre, qualcuno ha riscontrato problemi con l'utilizzo di PyPy con pyscopg2? Sembra abbastanza facile ripiegare su CPython se qualcosa non funziona correttamente, ma per lo più sto cercando cose che un programmatore possa fare prima del tempo per prepararsi.

Mi sono guardato intorno, non sembra che psycopg2 funzioni in modo nativo con PyPy. Sebbene psycopg2-ctypes sembra funzionare per alcune persone, c'è stata una discussione su pypy-dev . Lavoro su Windows e, purtroppo, non credo che psycopg2-ctypes sia ancora pronto per Windows.


8
C'è un bel discorso di Alex dal Djangocon Europe 2011, dove parla anche dei problemi postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant

3
A proposito, chiamare il codice c da PyPy è ancora molto più lento rispetto all'utilizzo di moduli Python puri. Quindi probabilmente non otterrai alcun vantaggio dall'esecuzione di Django + psycopg2 tramite PyPy. Puoi riscrivere psycopg2 in RPython o utilizzare CPython e ottimizzare le parti critiche della tua applicazione con Cython .
Vladimir Protasov

Inoltre: bitbucket.org/alex_gaynor/pypy-postgresql (un po 'vecchio ...)
jperelli

2
Alcune persone intorno a me raccomandano psycopg2ct , ma senza django ... Può aiutare ...
Dingo

qual è il tuo sistema operativo, distribuzione, versione?
pylover

Risposte:


33

psycopg2cffi (aggiornato 2015)

psycopg2cffi è ancora un altro sostituto compatibile con psycopg2 e dovrebbe fornire le migliori prestazioni PostgreSQL con PyPy. Aggiungilo al tuo settings.pyper rimanere compatibile con entrambi:

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

psycopg2-ctypes (2012)

So anche che alcune persone usano psycopg2-ctypes.

Questo è il modo più semplice; per rimanere compatibile con entrambi, aggiungi questo codice nel tuo Django settings.py:

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

Ho provato questo alcune versioni fa; purtroppo nella mia esperienza, psycopg2-ctypes nega i piccoli guadagni in termini di prestazioni offerti da PyPy. Ma YMMV, dipende da quanto il tuo codice è compatibile con JIT in generale e dalla frazione di tempo che impieghi effettivamente a eseguire codice Python. E forse da allora PyPy è solo migliorato.

e non credo che psycopg2-ctypes sia ancora pronto per Windows

Non l'ho provato, ma ctypes è indipendente dalla piattaforma. AFAICT devi solo assicurarti che la libpq.dlllibreria sia caricabile (situata in una directory nella tua variabile d'ambiente PATH o directory locale) e dovrebbe funzionare su Windows proprio come su Linux.

pypy-postgresql

Vedo che Alex Gaynor ha creato un fork di PyPy chiamato pypy-postgresql.

Non credo che questa sia una buona scelta a lungo termine. Il ramo non è stato aggiornato da più di un anno ei miei tentativi di costruirlo sono falliti. E comunque sembra sbagliato codificare un driver PostgreSQL nell'interprete.

Credo che non ci siano nemmeno i binari là fuori di pypy-postgresql, quindi se vuoi usarlo, dovresti costruire tu stesso l'intero ramo PyPy. Non per i deboli di cuore: bastano decine di minuti e una macchina con almeno 4 GB di memoria. (Istruzioni ufficiali: http://pypy.org/download.html#building-from-source )

Per costruire, hai prima bisogno della fonte. Se hai Mercurial installato, puoi semplicemente hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. In caso contrario, puoi scaricare il file zip "tip" di automagic: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Apri una riga di comando, vai nella directory decompressa e poi all'interno pypy/translator/goal

Se hai installato PyPy, ti consigliamo di usarlo per creare:

pypy translate.py -Ojit

Altrimenti:

python translate.py -Ojit

Purtroppo è qui che finisce la mia conoscenza. Ottengo l'errore " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


Potresti aggiungere un po ', a condizione, sai, di cosa potrebbe essere necessario per far funzionare pypy-pyscopg2 con pypy senza dover compilare pypy dal sorgente?
James R

1
Ho aggiornato la risposta con i dettagli su quanto lontano sono arrivato. Purtroppo la build è stata interrotta con un errore. Ricordo di aver passato un intero pomeriggio cercando di farlo costruire l'ultima volta, e ho anche fallito.
intgr

16

Alcune risorse aggiuntive:

  • Informazioni sulla compatibilità PyPy: adattatori DB
  • Pagina PostgreSQL nel wiki di Python
  • psycopg2cffi di Konstantin Lopuhin:
    implementazione basata su cffi di psycopg2 per PyPy 2.0 e versioni successive
    ( post del blog , GitHub pronti contro termine , pagina PyPI , filo PyPy-dev )
    - Questo appare come il candidato più forte attualmente, ma non l'ho provato ancora
  • psycopg2ct di Michael van Tellingen:
    implementazione basata su ctypes di psycopg2 per PyPy 1.6 e versioni successive
    ( repository GitHub , pagina PyPI )
  • pypy-postgresql di Alex Gaynor:
    port in RPython abbandonato di psycopg2 implementato come fork di PyPy ( Bitbucket repo )
  • pypq :
    "Driver compatibile con Python PostgreSQL DBAPI 2.0 che utilizza ctypes e libpq.so, funziona con PyPy"
    ( discussione , pagina PyPI )
  • bpgsql :
    "Client PostGreSQL puro-python Barebones. Per lo più compatibile con DB-API 2.0 (PEP 249). Include un backend Django 1.0 sperimentale"
    ( discussione , pagina web , Google Code page )
  • pg8000 :
    "un'interfaccia Pure-Python compatibile con DB-API 2.0 per il motore di database PostgreSQL [...] non si basa su alcuna libreria esterna (come un modulo Python compilato o la libreria libpq di PostgreSQL)"
    ( pagina web , repository GitHub , Pagina PyPI )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.