使用PyPy或Shedskin加速现有Python App的部分内容

时间:2012-06-09 11:23:29

标签: python pypy

我希望为现有应用程序带来速度提升,我正在寻找有关可能选项的建议。该应用程序是用Python编写的,使用wxPython,并与py2exe一起打包(我只针对Windows平台)。应用程序的某些部分是计算密集型的,在解释Py​​thon中运行得太慢。我不熟悉C,所以移植部分代码并不是我的选择。

所以我的问题基本上是我清楚地了解我的选项,如下所示,或者我是从错误的方向接近这个?

  • 和pypy一起跑:今天我开始尝试Pypy - 结果令人兴奋,因为我可以从pypy解释器运行大部分代码,我看到5x +速度改进没有代码更改。但是,如果我理解正确,(a)支持wxpython的Pypy是still a work in progress,(b)我是cannot compile it down to an exe for distribution anyway。所以,除非我弄错了,这对我来说似乎是不合适的?没有办法打包,所以部分内容是用pypy执行的?
  • 将代码转换为RPython,用pypy进行翻译因此,下一个选项似乎实际上是将部分代码重写为pypy受限语言,这似乎是一项非常大的工作。但是,如果我这样做,部分代码可以编译成可执行文件(?),然后我可以通过ctypes(?)访问代码。
  • 其他限制选项 Shedskin似乎是一个受欢迎的选择,这更符合我的要求吗?其他选项似乎是Cpython,Psyco和Unladen,但它们都被取代或不再维护。

3 个答案:

答案 0 :(得分:6)

使用PyPy确实排除了py2exe和类似的工具,至少在移植一个之前(AFAIK没有活动的工作)。尽管如此,由于不需要安装PyPy二进制文件,您可能会使用包含Python源代码和PyPy二进制文件+ stdlib的更复杂的发行版,并使用一个小包装器(批处理文件,可执行文件)来轻松启动。我无法评论PyPy上的WxPython是否足够成熟以供使用,但是如果您描述自己的情况,也许pypy-dev,wxpython-dev或任何一个IRC频道的某个人都可以给出推荐。

将代码翻译成RPython对我来说似乎不太可行。翻译工具链实际上并不是用于通用开发的工具,并且为嵌入/ ctypes生成C dll似乎并不重要。此外,RPython代码实际上低级别,使得你的Python代码足够受限可能相当于重写一半。

至于其他受限选项:您似乎将CPython(用C编写的原始Python解释器)与Cython(一种类似Python的语言的编译器混合,它发出适用于CPython扩展模块的C代码)混淆。这两个项目都很活跃。我对Shedskin并不是很熟悉,但它似乎是一个开发整个程序的工具,很少或没有与非限制Python代码的交互。 Cython似乎更合适:虽然它需要手动类型注释和低级代码来实现真正良好的性能,但从Python中使用它是微不足道的:项目的目的是生成扩展模块。

答案 1 :(得分:3)

我肯定会看看Cython,我一直在玩它,并且看到的速度比纯Python高出约100倍。使用配置文件模块首先找到瓶颈。通常,循环是进入Cython时提高速度的最大机会。您还应该考虑是否可以在Numpy中使用数组/向量操作而不是循环,如果是这样,也可以提供极大的性能提升。例如:

a = range(1000000)
for i in range(len(a)):
    a[i] += 5

慢,真慢。另一方面:

a = numpy.arange(10000000)
a = a +5

速度快,速度快。

答案 2 :(得分:0)

更正:脱皮可以用来生成扩展模块,以及整个程序。