Bagaimana Anda membuat PyPy, Django dan PostgreSQL bekerja bersama?

91

Percabangan, atau kombinasi paket apa yang harus digunakan seseorang untuk membuat PyPy, Django dan PostgreSQL bermain bagus bersama?

Saya tahu bahwa PyPy dan Django bermain bagus bersama, tetapi saya kurang yakin tentang PyPy dan PostgreSQL. Saya melihat bahwa Alex Gaynor telah membuat garpu PyPy yang disebut pypy-postgresql . Saya juga tahu bahwa beberapa orang menggunakan psycopg2-ctypes .

Apakah ada perbedaan antara garpu ini? Atau haruskah kita menggunakan 1.9 PyPy yang stabil dan menggunakan psycopg2-ctypes? Menggunakan opsi ctypes dapat merusak kinerja, lihat komentar di bawah.

Juga, apakah ada yang mengalami kesulitan dalam menggunakan PyPy dengan pyscopg2? Tampaknya cukup mudah untuk kembali ke CPython jika ada sesuatu yang tidak berfungsi dengan baik, tetapi kebanyakan saya mencari hal-hal yang dapat dilakukan programmer sebelumnya untuk mempersiapkannya.

Saya melihat sekeliling, tampaknya psycopg2 tidak berfungsi secara native dengan PyPy. Meskipun, psycopg2-ctypes tampaknya berfungsi untuk sebagian orang, ada diskusi tentang pypy-dev . Saya bekerja di Windows, dan saya rasa psycopg2-ctypes belum siap untuk Windows, sayangnya.

James R
sumber
8
Ada pembicaraan bagus oleh Alex dari Djangocon Eropa 2011, di mana dia juga berbicara tentang masalah postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant
3
BTW, memanggil kode c dari PyPy masih jauh lebih lambat dibandingkan menggunakan modul python murni. Jadi Anda mungkin tidak akan mendapatkan keuntungan apapun dari menjalankan Django + psycopg2 melalui PyPy. Anda dapat menulis ulang psycopg2 dalam RPython atau menggunakan CPython dan mengoptimalkan bagian penting aplikasi Anda dengan Cython .
Vladimir Protasov
Juga: bitbucket.org/alex_gaynor/pypy-postgresql (agak tua ...)
jperelli
2
Beberapa orang di sekitar saya merekomendasikan psycopg2ct , tetapi tanpa django ... Mungkin dapat membantu ...
Dingo
apa os, distribusi, versi Anda?
pylover

Jawaban:

33

psycopg2cffi (Diperbarui 2015)

psycopg2cffi adalah pengganti lain yang kompatibel dengan psycopg2 dan harus memberikan kinerja PostgreSQL terbaik dengan PyPy. Tambahkan ini ke Anda settings.pyagar tetap kompatibel dengan keduanya:

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

psycopg2-ctypes (2012)

Saya juga tahu bahwa beberapa orang menggunakan psycopg2-ctypes.

Ini cara termudah; agar tetap kompatibel dengan keduanya, cukup tambahkan kode ini di Django Anda settings.py:

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

Saya menguji ini beberapa rilis yang lalu; sayangnya dalam pengalaman saya, psycopg2-ctypes meniadakan peningkatan kinerja kecil yang diberikan oleh PyPy. Tapi YMMV, itu tergantung pada seberapa ramah JIT kode Anda secara umum dan berapa banyak waktu yang Anda habiskan untuk menjalankan kode Python. Dan mungkin PyPy baru saja berkembang sejak saat itu.

dan menurut saya psycopg2-ctypes belum siap untuk Windows

Saya belum mencoba ini, tetapi ctypes tidak bergantung pada platform. AFAICT Anda hanya perlu memastikan bahwa libpq.dllpustaka dapat dimuat (terletak di direktori di variabel lingkungan PATH atau direktori lokal Anda) dan itu harus bekerja di Windows seperti di Linux.

pypy-postgresql

Saya melihat bahwa Alex Gaynor telah membuat garpu PyPy yang disebut pypy-postgresql.

Saya rasa ini bukan pilihan yang baik dalam jangka panjang. Cabang tersebut belum diperbarui selama lebih dari satu tahun dan upaya saya untuk membangunnya gagal. Dan tampaknya salah untuk membuat kode keras driver PostgreSQL di interpreter.

Saya percaya tidak ada binari di luar sana dari pypy-postgresql, jadi jika Anda ingin menggunakannya, Anda perlu membangun seluruh cabang PyPy sendiri. Bukan untuk menjadi lemah hati: dibutuhkan puluhan menit dan mesin dengan memori minimal 4 GB. (Instruksi resmi: http://pypy.org/download.html#building-from-source )

Untuk membangun, Anda membutuhkan sumbernya terlebih dahulu. Jika Anda menginstal Mercurial, Anda dapat melakukannya dengan mudah hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Jika tidak, Anda dapat mengunduh file zip "tip" automagic: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Buka baris perintah, masuk ke direktori yang didekompresi, lalu masuk ke dalam pypy/translator/goal

Jika Anda menginstal PyPy, disarankan untuk menggunakannya untuk membangun:

pypy translate.py -Ojit

Jika tidak:

python translate.py -Ojit

Sayangnya di sinilah pengetahuan saya berakhir. Saya mendapatkan kesalahan " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"

intgr
sumber
Bisakah Anda menambahkan sedikit, asalkan, Anda tahu, tentang apa yang diperlukan agar pypy-pyscopg2 bekerja dengan pypy tanpa perlu mengompilasi pypy dari sumber?
James R
1
Saya memperbarui jawaban dengan detail tentang seberapa jauh saya mendapatkannya. Sayangnya, build dibatalkan karena kesalahan. Saya ingat menghabiskan sepanjang sore mencoba membuatnya untuk membangun terakhir kali, dan gagal juga.
intgr
16

Beberapa sumber tambahan:

  • Informasi kompatibilitas PyPy: Adaptor DB
  • Halaman PostgreSQL di wiki Python
  • psycopg2cffi oleh Konstantin Lopuhin:
    implementasi berbasis cffi dari psycopg2 untuk PyPy 2.0 dan yang lebih baru
    ( posting blog , repo GitHub , halaman PyPI , utas pypy-dev )
    - ini terlihat seperti kandidat terkuat saat ini, tetapi saya belum mengujinya
  • psycopg2ct oleh Michael van Tellingen:
    implementasi berbasis ctypes dari psycopg2 untuk PyPy 1.6 dan yang lebih baru
    ( GitHub repo , halaman PyPI )
  • pypy-postgresql oleh Alex Gaynor:
    port RPython dari psycopg2 yang ditinggalkan diimplementasikan sebagai garpu PyPy ( Bitbucket repo )
  • pypq :
    "Driver yang sesuai dengan Python PostgreSQL DBAPI 2.0 menggunakan ctypes dan libpq.so, bekerja dengan PyPy"
    ( diskusi , halaman PyPI )
  • bpgsql :
    "Barebones pure-python PostGreSQL client. Sebagian besar sesuai dengan DB-API 2.0 (PEP 249). Termasuk backend Django 1.0 eksperimental"
    ( diskusi , halaman web , halaman Google Code )
  • pg8000 :
    "antarmuka Pure-Python yang kompatibel dengan DB-API 2.0 ke mesin database PostgreSQL [...] tidak bergantung pada pustaka eksternal (seperti modul python yang dikompilasi, atau pustaka libpq PostgreSQL)"
    ( halaman web , repo GitHub , Halaman PyPI )
akaihola
sumber