5

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

所以我的问题基本上是我是否清楚地了解了我在下面概述的选项,还是我从错误的方向接近这个?

  • 使用 pypy 运行:今天我开始尝试使用 Pypy - 结果令人兴奋,因为我可以从 pypy 解释器运行大部分代码,并且我看到速度提高了 5 倍以上,而无需更改代码。但是,如果我理解正确,(a)支持 wxpython 的 Pypy仍在进行中,并且(b)我无法将其编译为 exe 以进行分发。所以除非我弄错了,这对我来说似乎是不行的?没有办法打包东西,所以它的一部分是用 pypy 执行的?
  • 将代码转换为 RPython,使用 pypy 进行翻译所以下一个选项似乎实际上是将部分代码重写为 pypy 受限语言,这似乎是一项相当大的工作。但如果我这样做,部分代码可以编译为可执行文件(?),然后我可以通过 ctypes(?)访问代码。
  • 其他受限选项Shedskin 似乎是这里的流行替代品,这是否更符合我的要求?其他选项似乎是 Cpython、Psyco 和 Unladen,但它们都已被取代或不再维护。
4

3 回答 3

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 中使用它是微不足道的:该项目的真正目的是生成扩展模块。

于 2012-06-09T11:44:11.857 回答
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

很快,真的很快。

于 2012-06-09T12:37:55.713 回答
0

更正:shedskin 可用于生成扩展模块以及整个程序。

于 2012-06-11T03:03:26.740 回答