我希望为现有应用程序带来速度提升,我正在寻找有关可能选项的建议。该应用程序是用Python编写的,使用wxPython,并与py2exe
一起打包(我只针对Windows平台)。应用程序的某些部分是计算密集型的,在解释Python中运行得太慢。我不熟悉C,所以移植部分代码并不是我的选择。
所以我的问题基本上是我清楚地了解我的选项,如下所示,或者我是从错误的方向接近这个?
答案 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)
更正:脱皮可以用来生成扩展模块,以及整个程序。