Làm cách nào để PyPy, Django và PostgreSQL hoạt động cùng nhau?


90

Nên sử dụng fork hoặc kết hợp các gói nào để PyPy, Django và PostgreSQL chơi tốt với nhau?

Tôi biết rằng PyPy và Django chơi tốt với nhau, nhưng tôi không chắc về PyPy và PostgreSQL. Tôi thấy rằng Alex Gaynor đã tạo ra một nhánh của PyPy được gọi là pypy-postgresql . Tôi cũng biết rằng một số người đang sử dụng psycopg2-ctypes .

Có sự khác biệt giữa những cái nĩa này không? Hay chúng ta nên sử dụng PyPy 1.9 ổn định và sử dụng psycopg2-ctypes? Sử dụng các tùy chọn ctypes có thể ảnh hưởng đến hiệu suất, hãy xem nhận xét bên dưới.

Ngoài ra, có ai gặp bất kỳ cạm bẫy nào khi sử dụng PyPy với pyscopg2 không? Có vẻ dễ dàng để quay trở lại CPython nếu điều gì đó không hoạt động bình thường, nhưng chủ yếu là tôi đang tìm kiếm những thứ mà một lập trình viên có thể làm trước thời hạn để chuẩn bị.

Tôi nhìn xung quanh, có vẻ như psycopg2 không hoạt động với PyPy. Mặc dù psycopg2-ctypes dường như có hiệu quả với một số người, nhưng đã có một cuộc thảo luận về pypy-dev . Tôi làm việc trên Windows và tôi chưa nghĩ rằng psycopg2-ctypes đã sẵn sàng cho Windows, thật đáng buồn.


8
Có một cuộc nói chuyện thoải mái bởi Alex từ Djangocon châu Âu năm 2011, nơi ông cũng nói về các vấn đề postgres: blip.tv/djangocon-europe-2011/...
Bernhard Vallant

3
BTW, gọi mã c từ PyPy vẫn chậm hơn nhiều so với việc sử dụng mô-đun python thuần túy. Vì vậy, bạn có thể sẽ không nhận được bất kỳ lợi ích nào từ việc chạy Django + psycopg2 thông qua PyPy. Bạn có thể viết lại psycopg2 trong RPython hoặc sử dụng CPython và tối ưu hóa các phần quan trọng trong ứng dụng của bạn với Cython .
Vladimir Protasov


2
Một số người xung quanh tôi giới thiệu psycopg2ct , nhưng không django ... tháng có thể giúp ...
Dingo

hệ điều hành, phân phối, phiên bản của bạn là gì?
pylover

Câu trả lời:


33

psycopg2cffi (Cập nhật năm 2015)

psycopg2cffi là một sự thay thế tương thích với psycopg2 khác và sẽ cung cấp hiệu suất PostgreSQL tốt nhất với PyPy. Thêm cái này vào của bạn settings.pyđể vẫn tương thích với cả hai:

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

psycopg2-ctypes (2012)

Tôi cũng biết rằng một số người đang sử dụng psycopg2-ctypes.

Đây là cách dễ dàng nhất; để tương thích với cả hai, chỉ cần thêm mã này vào Django của bạn settings.py:

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

Tôi đã thử nghiệm điều này một vài bản phát hành trước đây; Theo kinh nghiệm của tôi, thật đáng buồn là psycopg2-ctypes lại phủ nhận những lợi ích hiệu suất nhỏ mà PyPy mang lại. Nhưng YMMV, nó phụ thuộc vào mức độ thân thiện với JIT của mã nói chung và phần thời gian bạn thực sự dành để chạy mã Python. Và có lẽ PyPy mới tiến bộ hơn kể từ đó.

và tôi chưa nghĩ rằng psycopg2-ctypes đã sẵn sàng cho Windows

Tôi chưa thử điều này, nhưng ctypes độc lập với nền tảng. AFAICT bạn chỉ cần đảm bảo rằng libpq.dllthư viện có thể tải được (nằm trong một thư mục trong biến môi trường PATH hoặc thư mục cục bộ của bạn) và nó sẽ hoạt động trên Windows giống như trong Linux.

pypy-postgresql

Tôi thấy rằng Alex Gaynor đã tạo ra một nhánh của PyPy được gọi là pypy-postgresql.

Tôi không nghĩ đây là một lựa chọn tốt về lâu dài. Chi nhánh đã không được cập nhật trong hơn một năm và nỗ lực của tôi để xây dựng nó đã thất bại. Và có vẻ như sai khi viết mã cứng một trình điều khiển PostgreSQL trong trình thông dịch.

Tôi tin rằng không có mã nhị phân nào ngoài pypy-postgresql, vì vậy nếu bạn muốn sử dụng nó, bạn cần phải tự mình xây dựng toàn bộ chi nhánh PyPy. Không dành cho người yếu tim: mất hàng chục phút và máy có bộ nhớ ít nhất 4 GB. (Hướng dẫn chính thức: http://pypy.org/download.html#building-from-source )

Để xây dựng, trước tiên bạn cần nguồn. Nếu bạn đã cài đặt Mercurial, bạn có thể đơn giản hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql. Nếu không, bạn có thể tải xuống tệp zip "mẹo" tự động: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

Mở một dòng lệnh, đi vào thư mục đã giải nén, rồi vào bên trong pypy/translator/goal

Nếu bạn đã cài đặt PyPy, bạn nên sử dụng nó để xây dựng:

pypy translate.py -Ojit

Nếu không thì:

python translate.py -Ojit

Đáng buồn thay, đây là nơi kiến ​​thức của tôi kết thúc. Tôi nhận được lỗi " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


Bạn có thể bổ sung một chút, miễn là bạn biết, về những gì có thể cần để khiến pypy-pyscopg2 hoạt động với pypy mà không cần biên dịch pypy từ nguồn?
James R

1
Tôi đã cập nhật câu trả lời với chi tiết về việc tôi đã nhận được bao xa. Thật không may, bản dựng bị hủy bỏ do lỗi. Tôi nhớ đã dành cả buổi chiều để cố gắng hoàn thiện nó lần cuối cùng và cũng thất bại.
intgr

16

Một số tài nguyên bổ sung:

  • Thông tin về khả năng tương thích của PyPy: Bộ điều hợp DB
  • Trang PostgreSQL trên Python wiki
  • psycopg2cffi của Konstantin Lopuhin:
    triển khai dựa trên cffi của psycopg2 cho PyPy 2.0 và mới hơn
    ( bài đăng trên blog , repo GitHub , trang PyPI , chuỗi pypy-dev )
    - đây có vẻ là ứng cử viên mạnh nhất hiện tại, nhưng tôi chưa thử nghiệm nó
  • psycopg2ct của Michael van Tellingen:
    triển khai dựa trên ctypes của psycopg2 cho PyPy 1.6 và mới hơn
    ( GitHub repo , trang PyPI )
  • pypy-postgresql của Alex Gaynor:
    Cổng RPython bị bỏ rơi của psycopg2 được triển khai như một nhánh rẽ của PyPy ( Bitbucket repo )
  • pypq :
    "Trình điều khiển tương thích Python PostgreSQL DBAPI 2.0 sử dụng ctypes và libpq.so, hoạt động với PyPy"
    ( thảo luận , trang PyPI )
  • bpgsql :
    "Ứng dụng khách PostGreSQL thuần-python Barebone. Hầu hết tuân thủ DB-API 2.0 (PEP 249). Bao gồm phần phụ trợ Django 1.0 thử nghiệm"
    ( thảo luận , trang web , trang Google Code )
  • pg8000 :
    "giao diện Pure-Python tương thích DB-API 2.0 với công cụ cơ sở dữ liệu PostgreSQL [...] không dựa trên bất kỳ thư viện bên ngoài nào (chẳng hạn như mô-đun python đã biên dịch hoặc thư viện libpq của PostgreSQL)"
    ( trang web , GitHub repo , Trang PyPI )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.