【问题标题】:How do you get PyPy, Django and PostgreSQL to work together?如何让 PyPy、Django 和 PostgreSQL 协同工作?
【发布时间】:2012-03-10 03:52:40
【问题描述】:

应该使用什么 fork 或包组合来使 PyPy、Django 和 PostgreSQL 协同工作?

我知道 PyPy 和 Django 配合得很好,但我不太确定 PyPy 和 PostgreSQL。我确实看到 Alex Gaynor 制作了一个名为 pypy-postgresql 的 PyPy 分支。我也知道有些人在用psycopg2-ctypes

这些分叉之间有区别吗?还是我们应该使用稳定的 1.9 PyPy 并使用 psycopg2-ctypes?使用 ctypes 选项可能会影响性能,请参阅下面的评论。

另外,有没有人在使用 PyPy 和 pyscopg2 时遇到过任何陷阱?如果某些事情不能正常工作,回到 CPython 似乎很容易,但主要是我在寻找程序员可以提前做的事情来准备。

我环顾四周,似乎 psycopg2 不能与 PyPy 一起工作。尽管 psycopg2-ctypes 似乎确实对某些人有用,但在 pypy-dev 上进行了讨论。我在 Windows 上工作,但遗憾的是,我认为 psycopg2-ctypes 还没有为 Windows 做好准备。

【问题讨论】:

  • Alex 在 2011 年 Djangocon Europe 上发表了精彩的演讲,他还谈到了 postgres 问题:blip.tv/djangocon-europe-2011/…
  • 顺便说一句,从 PyPy 调用 c 代码仍然比使用纯 python 模块慢得多。所以你可能不会从通过 PyPy 运行 Django + psycopg2 中获得任何好处。您可以在 RPython 中重写 psycopg2 或使用 CPython 并使用 Cython 优化应用程序的关键部分。
  • 还有:bitbucket.org/alex_gaynor/pypy-postgresql(有点老……)
  • 我身边的一些人推荐psycopg2ct,但是没有django...May可以帮忙...
  • 你的操作系统、发行版、版本是什么?

标签: python django postgresql psycopg2 pypy


【解决方案1】:

psycopg2cffi(2015 年更新)

psycopg2cffi 是另一个与 psycopg2 兼容的替代品,应该使用 PyPy 提供最佳 PostgreSQL 性能。将此添加到您的 settings.py 以保持两者兼容:

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

psycopg2-ctypes (2012)

我也知道有些人在使用 psycopg2-ctypes。

这是最简单的方法;要保持两者兼容,只需将此代码添加到您的 Django settings.py

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

我在几个版本前对此进行了测试;可悲的是,根据我的经验,psycopg2-ctypes 否定了 PyPy 提供的小幅性能提升。但是 YMMV,这取决于您的代码对 JIT 的总体友好程度以及您实际花费多少时间运行 Python 代码。也许从那时起 PyPy 才刚刚改进。

而且我认为 psycopg2-ctypes 还没有为 Windows 做好准备

我还没有尝试过,但是 ctypes 是独立于平台的。 AFAICT,您只需要确保 libpq.dll 库是可加载的(位于 PATH 环境变量或本地目录中的目录中)并且它应该像在 Linux 中一样在 Windows 上工作。

pypy-postgresql

我确实看到 Alex Gaynor 制作了一个名为 pypy-postgresql 的 PyPy 分支。

从长远来看,我认为这不是一个好的选择。该分支已经一年多没有更新了,我构建它的尝试失败了。无论如何,在解释器中硬编码 PostgreSQL 驱动程序似乎是错误的。

我相信 pypy-postgresql 也没有二进制文件,所以如果你想使用它,你需要自己构建整个 PyPy 分支。不适合胆小的人:这需要几十分钟和一台至少有 4 GB 内存的机器。 (官方说明:http://pypy.org/download.html#building-from-source

要构建,您首先需要源代码。如果您安装了 Mercurial,您只需 hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql。如果没有,您可以下载自动“提示”压缩文件:https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

打开命令行,进入解压后的目录,然后进入pypy/translator/goal

如果您安装了 PyPy,建议使用它来构建:

pypy translate.py -Ojit

否则:

python translate.py -Ojit

遗憾的是,我的知识到此为止。我收到错误“BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG

【讨论】:

  • 您能否补充一点,前提是,您知道如何让 pypy-pyscopg2 与 pypy 一起工作,而无需从源代码编译 pypy?
  • 我更新了答案,详细说明了我走了多远。不幸的是,构建因错误而中止。我记得我花了一整个下午试图让它最后一次构建,也失败了。
【解决方案2】:

一些额外的资源:

  • PyPy 兼容性信息:DB adaptors
  • PostgreSQL page 在 Python wiki 上
  • psycopg2cffi,康斯坦丁·洛普欣(Konstantin Lopuhin):
    PyPy 2.0 和更新版本的 psycopg2 基于 cffi 的实现
    (blog post, GitHub repo, PyPI page, pypy-dev thread)
    – 这看起来是目前最强的候选人,但我还没有测试过
  • psycopg2ct 作者:Michael van Tellingen:
    PyPy 1.6 及更高版本的 psycopg2 基于 ctypes 的实现
    (GitHub repo, PyPI page)
  • pypy-postgresql 作者:Alex Gaynor:
    废弃的 Psycopg2 的 RPython 端口被实现为 PyPy 的一个分支 (Bitbucket repo)
  • pypq
    “使用 ctypes 和 libpq.so 的 Python PostgreSQL DBAPI 2.0 兼容驱动程序,适用于 PyPy”
    (discussion, PyPI page)
  • bpgsql
    “准系统的纯 Python PostGreSQL 客户端。大部分符合 DB-API 2.0 (PEP 249)。包括一个实验性的 Django 1.0 后端”
    (discussion, web page, Google Code page)
  • pg8000
    “与 PostgreSQL 数据库引擎的 DB-API 2.0 兼容的 Pure-Python 接口 [...] 不依赖任何外部库(例如已编译的 python 模块或 PostgreSQL 的 libpq 库)”
    (web page, GitHub repo, PyPI page)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2020-01-17
    • 2017-11-15
    • 2020-01-13
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多