应该使用什么 fork 或包组合来使 PyPy、Django 和 PostgreSQL 很好地协同工作?
我知道 PyPy 和 Django 一起玩得很好,但我不太确定 PyPy 和 PostgreSQL。我确实看到 Alex Gaynor 制作了一个名为 pypy-postgresql 的 PyPy 分支。我也知道有些人正在使用 psycopg2-ctypes 。
这些 fork 之间有区别吗?或者我们应该使用稳定的 1.9 PyPy 并使用 psycopg2-ctypes?使用 ctypes 选项可能会影响性能,请参阅下面的评论。
另外,有没有人在 pyscopg2 中使用 PyPy 时遇到过任何陷阱?如果某些事情不能正常工作,那么依靠 CPython 似乎很容易,但主要是我在寻找程序员可以提前做的准备工作。
我环顾四周,似乎 psycopg2 本身并不适用于 PyPy。尽管 psycopg2-ctypes 似乎确实对某些人有效,但对 pypy-dev 进行了讨论。我在 Windows 上工作,但遗憾的是,我认为 psycopg2-ctypes 还没有为 Windows 做好准备。
最佳答案
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)
这是最简单的方法;要与两者保持兼容,只需将此代码添加到您的 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 从那时起才有所改进。
我没有试过这个,但是 ctypes 是平台无关的。 AFAICT 你只需要确保
libpq.dll
库是可加载的(位于你的 PATH 环境变量或本地目录中的目录中),并且它应该像在 Linux 中一样在 Windows 上工作。pypy-postgresql
从长远来看,我认为这不是一个好的选择。分支已经一年多没有更新了,我尝试构建它失败了。无论如何,在解释器中硬编码 PostgreSQL 驱动程序似乎是错误的。
我相信 pypy-postgresql 也没有二进制文件,所以如果你想使用它,你需要自己构建整个 PyPy 分支。不适合胆小的人:它需要数十分钟和至少 4 GB 内存的机器。 (官方说明:http://pypy.org/download.html#building-from-source)
要构建,您首先需要源代码。如果您安装了 Mercurial,则只需
hg clone https://bitbucket.org/alex_gaynor/pypy-postgresql
即可。如果没有,您可以下载自动“提示”zip 文件: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
”关于python - 如何让 PyPy、Django 和 PostgreSQL 协同工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9350422/