【问题标题】:Speeding up Parts of Existing Python App with PyPy or Shedskin使用 PyPy 或 Shedskin 加速现有 Python 应用程序的某些部分
【发布时间】:2012-06-09 11:23:28
【问题描述】:

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

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

  • 使用 pypy 运行:今天我开始尝试使用 Pypy - 结果令人兴奋,因为我可以从 pypy 解释器运行大部分代码,而且我看到速度提高了 5 倍以上,而无需更改代码。但是,如果我理解正确,(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,但它们都已被取代或不再维护。

【问题讨论】:

    标签: python pypy


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,我已接受您的回答。然而,在与 Cython 玩了一个非常富有成效的下午之后,我想我遇到了一个无法克服的问题:Cython 缺乏线程支持。我以前在线程中运行并且没有锁定 GUI 的计算量很大的计算现在冻结了所有内容。从谷歌搜索来看,这似乎是设计使然;获得并行性(docs.cython.org/src/userguide/parallelism.html#parallel)就是释放 GIL,GIL 中的所有代码都不能使用任何本机 python 对象,我理解正确吗?那会让 Cython 不好。
    • @NickJ (1) 我不知道 Cython 是否支持 Python 线程 - 但我不明白为什么它不能。也许您链接到的替代方案只是 preferred,因为它可以使用多个 CPU。 (2) 我不确定这是否是您的拼写错误,但受 GIL 保护的代码 能够使用 Python 类型,而 nogil 部分不能(因为 CPython,因此所有Python 类型,依赖于 GIL)。 (3) 除此之外,您可以在 Cython 中不使用 threading,方法是将您想要并行化的任何内容放入相对纯的 Cython 函数中并通过 Python 启动线程。
    【解决方案2】:

    我肯定会研究 Cython,我一直在使用它,并且已经看到比纯 python 的速度提高了 ~100 倍。首先使用配置文件模块找到瓶颈。通常循环是去 Cython 时提高速度的最大机会。您还应该查看是否可以在 Numpy 中使用数组/向量操作而不是循环,如果这样也可以极大地提高性能。例如:

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

    很慢,真的很慢。另一方面:

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

    很快,真的很快。

    【讨论】:

    • 对于这么大的数组,a+=5 可能更快
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多