PyPy, Django ve PostgreSQL'in birlikte çalışmasını nasıl sağlarsınız?


91

PyPy, Django ve PostgreSQL'in birlikte güzel oynamasını sağlamak için hangi çatal veya paket kombinasyonu kullanılmalıdır?

PyPy ve Django'nun birlikte iyi oynadığını biliyorum, ancak PyPy ve PostgreSQL hakkında daha az eminim. Alex Gaynor'un pypy-postgresql adında bir PyPy çatalı yaptığını görüyorum . Ayrıca bazı kişilerin psycopg2-ctypes kullandığını da biliyorum .

Bu çatallar arasında bir fark var mı? Yoksa kararlı 1.9 PyPy'yi ve psycopg2-ctype'leri mi kullanmalıyız? Ctype seçeneklerini kullanmak performansa zarar verebilir, aşağıdaki yoruma bakın.

Ayrıca, PyPy'yi pyscopg2 ile kullanmanın herhangi bir tuzağı olan oldu mu? Bir şeyler düzgün çalışmıyorsa CPython'a geri dönmek yeterince kolay görünüyor, ancak çoğunlukla bir programcının hazırlamak için önceden yapabileceği şeyleri arıyorum.

Etrafıma baktım, psycopg2'nin PyPy ile doğal olarak çalıştığı görülmüyor. Psycopg2-ctypes bazı insanlar için çalışıyor gibi görünse de, pypy-dev hakkında bir tartışma oldu . Windows üzerinde çalışıyorum ve ne yazık ki psycopg2-ctypes'ın henüz Windows için hazır olduğunu düşünmüyorum.


8
Djangocon Europe 2011'den Alex'in postgres konularından da bahsettiği güzel bir konuşma var: blip.tv/djangocon-europe-2011/…
Bernhard Vallant

3
BTW, PyPy'den c kodunu çağırmak, saf python modüllerini kullanmaktan hala çok daha yavaştır. Dolayısıyla, Django + psycopg2'yi PyPy aracılığıyla çalıştırmanın herhangi bir faydası olmayacak. RPython'da psycopg2'yi yeniden yazabilir veya CPython'u kullanabilir ve Cython ile uygulamanızın kritik kısımlarını optimize edebilirsiniz .
Vladimir Protasov


2
Etrafımdaki bazı insanlar psycopg2ct'i öneriyor , ancak django olmadan ... Yardımcı olabilir ...
Dingo

işletim sisteminiz, dağıtımınız, sürümünüz nedir?
pylover

Yanıtlar:


33

psycopg2cffi (2015'te güncellendi)

psycopg2cffi bir başka psycopg2 uyumlu yedektir ve PyPy ile en iyi PostgreSQL performansını sağlamalıdır. settings.pyİkisiyle de uyumlu kalmak için bunu ekleyin :

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

psycopg2-ctypes (2012)

Ayrıca bazı kişilerin psycopg2-ctypes kullandığını da biliyorum.

Bu en kolay yol; her ikisiyle de uyumlu kalmak için, bu kodu Django'nuza eklemeniz yeterlidir settings.py:

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

Bunu birkaç yayın önce test ettim; ne yazık ki deneyimime göre, psycopg2-ctypes PyPy'nin sağladığı küçük performans kazanımlarını reddediyor. Ancak YMMV, kodunuzun genel olarak ne kadar JIT dostu olduğuna ve Python kodunu çalıştırmak için gerçekte ne kadar zaman harcadığınıza bağlıdır. Ve belki PyPy o zamandan beri gelişmiştir.

ve psycopg2-ctypes'ın henüz Windows için hazır olduğunu düşünmüyorum

Bunu denemedim, ancak ctypes platformdan bağımsızdır. AFAICT sadece libpq.dllkitaplığın yüklenebilir olduğundan (PATH ortam değişkeninizdeki veya yerel dizininizdeki bir dizinde bulunduğundan) ve Linux'ta olduğu gibi Windows üzerinde çalıştığından emin olmanız gerekir.

pypy-postgresql

Alex Gaynor'un pypy-postgresql adında bir PyPy çatalı yaptığını görüyorum.

Bunun uzun vadede iyi bir seçim olduğunu düşünmüyorum. Şube bir yıldan fazla bir süredir güncellenmedi ve onu inşa etme girişimlerim başarısız oldu. Ve yine de bir PostgreSQL sürücüsünü yorumlayıcıya sabit kodlamak yanlış görünüyor.

Orada pypy-postgresql'in de ikilisi olmadığına inanıyorum, bu yüzden kullanmak istiyorsanız, tüm PyPy şubesini kendiniz oluşturmanız gerekir. Kalbi zayıf olanlar için değil: onlarca dakika ve en az 4 GB belleğe sahip bir makine alır. (Resmi talimatlar: http://pypy.org/download.html#building-from-source )

İnşa etmek için önce kaynağa ihtiyacınız var. Mercurial'i yüklediyseniz, kolayca yapabilirsiniz hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Değilse, automagic "ipucu" zip dosyasını indirebilirsiniz: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Bir komut satırı açın, sıkıştırılmış dizine gidin ve ardından pypy/translator/goal

PyPy kuruluysa, bunu oluşturmak için kullanmanız önerilir:

pypy translate.py -Ojit

Aksi takdirde:

python translate.py -Ojit

Maalesef bilgim burada bitiyor. " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG" Hatasını alıyorum


Pypy'yi kaynaktan derlemeye gerek kalmadan pypy ile çalışmak için pypy-pyscopg2'yi elde etmek için neler gerektiği hakkında biraz ekleyebilir misiniz?
James R.

1
Cevabı ne kadar ilerlediğime dair ayrıntılarla güncelledim. Maalesef yapı bir hata ile iptal edildi. Onu son kez inşa etmeye çalışmak için bütün bir öğleden sonra harcadığımı hatırlıyorum ve ben de başarısız oldum.
intgr

16

Bazı ek kaynaklar:

  • PyPy uyumluluk bilgileri: DB adaptörleri
  • Python wiki'deki PostgreSQL sayfası
  • psycopg2cffi , Konstantin Lopuhin:
    PyPy 2.0 ve daha yenisi için psycopg2'nin cffi tabanlı uygulaması
    ( blog yazısı , GitHub repo , PyPI sayfası , pypy-dev dizisi )
    - bu şu anda en güçlü aday gibi görünüyor, ancak henüz test etmedim
  • psycopg2ct , Michael van Tellingen:
    PyPy 1.6 ve daha yenisi için psycopg2'nin ctypes tabanlı uygulaması
    ( GitHub repo , PyPI sayfası )
  • Alex Gaynor'dan pypy-postgresql :
    PyPy'nin bir çatalı olarak uygulanan terk edilmiş psycopg2 RPython portu ( Bitbucket repo )
  • pypq :
    "ctypes ve libpq.so kullanan Python PostgreSQL DBAPI 2.0 uyumlu sürücü, PyPy ile çalışır"
    ( tartışma , PyPI sayfası )
  • bpgsql :
    "Barebones pure-python PostGreSQL istemcisi. Çoğunlukla DB-API 2.0 (PEP 249) uyumlu. Deneysel bir Django 1.0 arka ucu içerir"
    ( tartışma , web sayfası , Google Code sayfası )
  • pg8000 :
    "PostgreSQL veritabanı motoruna DB-API 2.0 uyumlu bir Pure-Python arayüzü [...] herhangi bir harici kitaplığa (derlenmiş bir python modülü veya PostgreSQL'in libpq kitaplığı gibi) dayanmaz"
    ( web sayfası , GitHub deposu , PyPI sayfa )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.