¿Cómo se consigue que PyPy, Django y PostgreSQL trabajen juntos?

90

¿Qué bifurcación o combinación de paquetes debería uno usar para hacer que PyPy, Django y PostgreSQL funcionen bien juntos?

Sé que PyPy y Django funcionan bien juntos, pero estoy menos seguro acerca de PyPy y PostgreSQL. Veo que Alex Gaynor ha creado una bifurcación de PyPy llamada pypy-postgresql . También sé que algunas personas utilizan psycopg2-ctypes .

¿Hay alguna diferencia entre estas horquillas? ¿O deberíamos usar el PyPy 1.9 estable y usar psycopg2-ctypes? El uso de las opciones de ctypes podría afectar el rendimiento, consulte el comentario a continuación.

Además, ¿alguien ha experimentado algún problema al usar PyPy con pyscopg2? Parece bastante fácil recurrir a CPython si algo no funciona bien, pero sobre todo estoy buscando cosas que un programador pueda hacer antes de tiempo para prepararse.

Miré a mi alrededor, no parece que psycopg2 funcione de forma nativa con PyPy. Aunque, psycopg2-ctypes parece estar funcionando para algunas personas, hubo una discusión sobre pypy-dev . Trabajo en Windows y, lamentablemente, no creo que psycopg2-ctypes esté listo para Windows todavía.

James R
fuente
8
Hay una bonita charla de Alex de Djangocon Europe 2011, donde también habla sobre los problemas de postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant
3
Por cierto, llamar al código c desde PyPy sigue siendo mucho más lento que usar módulos de Python puros. Por lo tanto, probablemente no obtendrá ningún beneficio al ejecutar Django + psycopg2 a través de PyPy. Puede reescribir psycopg2 en RPython o usar CPython y optimizar partes críticas de su aplicación con Cython .
Vladimir Protasov
También: bitbucket.org/alex_gaynor/pypy-postgresql (algo viejo ...)
jperelli
2
Algunas personas a mi alrededor recomiendan psycopg2ct , pero sin django ... May puede ayudar ...
Dingo
¿Cuál es su sistema operativo, distribución, versión?
Pylover

Respuestas:

33

psycopg2cffi (actualizado en 2015)

psycopg2cffi es otro reemplazo compatible con psycopg2 y debería proporcionar el mejor rendimiento de PostgreSQL con PyPy. Agregue esto a su settings.pypara seguir siendo compatible con ambos:

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

psycopg2-ctypes (2012)

También sé que algunas personas utilizan psycopg2-ctypes.

Esta es la manera más fácil; para seguir siendo compatible con ambos, simplemente agregue este código en su Django settings.py:

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

Probé esto hace algunos lanzamientos; lamentablemente, en mi experiencia, psycopg2-ctypes niega las pequeñas ganancias de rendimiento que ofrece PyPy. Pero YMMV, depende de qué tan compatible con JIT sea su código en general y de la fracción de tiempo que dedique realmente a ejecutar código Python. Y tal vez PyPy haya mejorado desde entonces.

y no creo que psycopg2-ctypes esté listo para Windows todavía

No lo he probado, pero ctypes es independiente de la plataforma. AFAICT, solo tiene que asegurarse de que la libpq.dllbiblioteca sea cargable (ubicada en un directorio en su variable de entorno PATH o directorio local) y debería funcionar en Windows como en Linux.

pypy-postgresql

Veo que Alex Gaynor ha creado una bifurcación de PyPy llamada pypy-postgresql.

No creo que esta sea una buena opción a largo plazo. La sucursal no se ha actualizado durante más de un año y mis intentos de construirla han fallado. Y parece incorrecto codificar un controlador PostgreSQL en el intérprete de todos modos.

Creo que tampoco hay binarios de pypy-postgresql, por lo que si desea usarlo, deberá compilar toda la rama de PyPy usted mismo. No para los débiles de corazón: se necesitan decenas de minutos y una máquina con al menos 4 GB de memoria. (Instrucciones oficiales: http://pypy.org/download.html#building-from-source )

Para construir, primero necesita la fuente. Si tiene Mercurial instalado, simplemente puede hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. De lo contrario, puede descargar el archivo zip "tip" de automagic: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Abra una línea de comando, vaya al directorio descomprimido y luego dentro pypy/translator/goal

Si tiene PyPy instalado, se recomienda usarlo para compilar:

pypy translate.py -Ojit

De otra manera:

python translate.py -Ojit

Lamentablemente, aquí es donde termina mi conocimiento. Me sale el error " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"

intgr
fuente
¿Podría agregar un poco, dado que, ya sabe, sobre lo que podría ser necesario para que pypy-pyscopg2 funcione con pypy sin necesidad de compilar pypy desde la fuente?
James R
1
Actualicé la respuesta con detalles sobre qué tan lejos llegué. Desafortunadamente, la compilación se canceló con un error. Recuerdo que pasé una tarde entera tratando de hacer que se construyera la última vez, y también fallé.
intgr
16

Algunos recursos adicionales:

akaihola
fuente