92

应该使用什么 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 做好准备。

4

2 回答 2

36

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

于 2012-06-30T01:07:07.727 回答
16

一些额外的资源:

  • PyPy 兼容性信息:数据库适配器
  • Python wiki 上的PostgreSQL 页面
  • Psycopg2cffi由 Konstantin Lopuhin 编写:
    PyPy 2.0 和更新版本的 psycopg2 基于 cffi 的实现
    博客文章GitHub存储库、PyPI 页面pypy-dev 线程
    ——这看起来是目前最强的候选者,但我还没有测试过
  • Michael van Tellingen 的 psycopg2ct:PyPy
    1.6 和更新版本的 psycopg2 基于 ctypes 的实现
    GitHub存储库,PyPI 页面
  • Alex Gaynor 的pypy-postgresql
    : psycopg2 的废弃 RPython 端口实现为 PyPy 的一个分支(Bitbucket repo
  • pypq
    “使用 ctypes 和 libpq.so 的 Python PostgreSQL DBAPI 2.0 兼容驱动程序,可与 PyPy 一起使用”
    讨论PyPI 页面
  • bpgsql
    “准系统纯 python PostGreSQL 客户端。主要符合 DB-API 2.0 (PEP 249)。包括实验性 Django 1.0 后端”
    讨论网页Google 代码页
  • pg8000
    “与 PostgreSQL 数据库引擎的 DB-API 2.0 兼容的 Pure-Python 接口 [...] 不依赖任何外部库(例如编译的 python 模块或 PostgreSQL 的 libpq 库)”
    网页GitHub repo , PyPI 页面)
于 2012-12-01T21:34:45.087 回答