如何使PyPy,Django和PostgreSQL一起工作?


90

应该使用哪种分叉或软件包组合来使PyPy,Django和PostgreSQL相互配合?

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

这些叉子之间有区别吗?还是应该使用稳定的1.9 PyPy并使用psycopg2-ctypes?使用ctypes选项可能会损害性能,请参见下面的注释。

此外,有人将pyscopg2与PyPy结合使用会遇到任何陷阱吗?如果某些事情无法正常进行,使用CPython似乎很容易,但是我主要是在寻找程序员可以提前做的事情。

我环顾四周,似乎psycopg2无法与PyPy一起使用。尽管psycopg2-ctypes似乎确实对某些人有用,但有关pypy-dev的讨论。我在Windows上工作,可悲的是,我认为psycopg2-ctypes还没有为Windows准备就绪。


8
有一个很好的谈话由Alex从Djangocon 2011年欧洲,在那里他还谈到了Postgres的问题:blip.tv/djangocon-europe-2011/...
伯恩哈德Vallant

3
顺便说一句,从PyPy调用c代码仍然比使用纯python模块慢得多。因此,通过PyPy运行Django + psycopg2可能不会带来任何好处。你可以重写psycopg2 RPython或使用CPython的优化与应用程序的关键部分用Cython
弗拉基米尔·普罗塔索夫(Fladimir Protasov)2012年


2
我周围的一些人推荐psycopg2ct,但没有django ...可能会有所帮助...
Dingo 2012年

您的操作系统,发行版是什么版本?
pylover 2012年

Answers:


33

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。如果没有,您可以下载自动的“ tip” 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


如果您知道,要添加pypy-pyscopg2与pypy一起使用而无需从源代码编译pypy,可能需要添加一些内容吗?
詹姆斯·R

1
我用详细的答案更新了答案。不幸的是,构建因错误而中止。我记得整个下午都在努力使它最后一次构建,但是也失败了。
intgr 2012年

16

一些其他资源:

  • PyPy兼容性信息:数据库适配器
  • Python Wiki上的PostgreSQL页面
  • psycopg2cffi由康斯坦丁Lopuhin:
    基于CFFI实施psycopg2对PyPy 2.0和更高版本
    博客文章GitHub库的PyPI页pypy-dev的线程
    -这看起来像目前最强的候选人,但我还没有测试它尚未
  • psycopg2ct迈克尔面包车Tellingen:
    ctypes的基础实施psycopg2对PyPy 1.6和更高版本
    GitHub库的PyPI页
  • 亚历克斯·盖诺(Alex Gaynor)的pypy-postgresql
    废弃的psycopg2的RPython端口实现为PyPy(Bitbucket回购)的分支
  • pypq
    “使用ctypes和libpq.so的Python PostgreSQL DBAPI 2.0兼容驱动程序,与PyPy一起使用”
    讨论PyPI页
  • bpgsql
    “ Barebones纯Python PostGreSQL客户端。主要兼容DB-API 2.0(PEP 249)。包括实验性的Django 1.0后端”
    讨论网页Google代码页
  • pg8000
    “到PostgreSQL数据库引擎的与DB-API 2.0兼容的Pure-Python接口[...]不依赖任何外部库(例如编译的python模块或PostgreSQL的libpq库)”
    网页GitHub存储库PyPI页面
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.