代码之家  ›  专栏  ›  技术社区  ›  Eli Bendersky

为什么不总是在python代码中使用psyco呢?

  •  40
  • Eli Bendersky  · 技术社区  · 15 年前

    psyco 在优化Python代码方面似乎很有帮助,而且它是以一种非常非侵入性的方式完成的。

    因此,人们不得不怀疑。假设你总是在一个x86架构上(这是目前大多数应用运行的地方),为什么不总是使用 psyco 对于所有的python代码?它是否有时会出错并破坏程序的正确性?为一些奇怪的情况增加运行时间?

    你对此有过什么负面的经历吗?到目前为止,我最消极的经验是它使我的代码速度只提高了15%。通常会更好。

    当然,使用psyco并不能代替有效的算法和编码。但是,如果您能以两行(导入和调用psyco)的成本提高代码的性能,我认为没有什么好的理由不这样做。

    8 回复  |  直到 12 年前
        1
  •  22
  •   ire_and_curses    15 年前

    1)内存开销是主要开销,如其他答案所述。您还需要支付编译成本,如果您没有选择的话,这可能会令人望而却步。从 user reference :

    对于中型或大型应用程序来说,编译所有内容通常都是多余的。编译过多的缺点在于编译所花费的时间,加上此进程消耗的内存量。这是一种微妙的平衡。

    2)psyco编译实际上会损害性能。再次从用户指南( "known bugs" 部分):

    还有性能缺陷:在这种情况下,psyco会减慢代码速度而不是加速代码。很难完整列出可能的原因,但以下是一些常见的原因:

    • 内置的 map filter 必须避免使用函数,并将其替换为列表理解。例如, map(lambda x: x*x, lst) 应替换为更可读但更新的语法 [x*x for x in lst] .
    • 正则表达式的编译似乎没有从psyco中受益。(正则表达式的执行不受影响,因为它是C代码。)不要在此模块上启用psyco;如有必要,请明确禁用它,例如通过调用 psyco.cannotcompile(re.compile) .

    3)最后,在一些相对比较模糊的情况下,使用psyco实际上会引入bug。其中一些是 listed here .

        2
  •  6
  •   HUAGHAGUAH    15 年前

    psyco目前使用大量内存。 它只在兼容Intel386的环境下运行 处理器(在任何操作系统下)。 有一些微妙的语义 与方式的差异(即缺陷) python工作;它们不应该是 在大多数节目中都很明显。

    也见 caveats section .举个很难的例子,我注意到我的web应用程序用猎豹生成的模板和数据库I/O没有得到明显的加速。

        3
  •  5
  •   Devin Jeanpierre    15 年前

    当使用Pyglet时,我发现在整个应用程序上使用psyco都会导致应用程序无法正常运行。当然,我可以在数学重代码的小部分中使用它,但它不是必需的,所以我不费心。

    而且,psyco对我的分析结果做了一些奇怪的事情(例如,好吧,根本没有从非psyco版本更改它们)。我怀疑它不能很好地处理分析代码。

    我只是不使用它,除非我真的想要速度,这并不是经常使用。我的重点是算法优化,这通常会导致更好的加速。

        4
  •  4
  •   MrTopf    15 年前

    这还取决于你的瓶颈在哪里。我主要在做网络应用,瓶颈可能是更多的IO和数据库。所以你应该知道在哪里优化。

    同样要注意的是,也许你首先应该考虑你的代码,而不是直接向它扔psyco。所以我同意Devin的观点,算法优化应该是第一位的,它们可能会有较小的不必要的副作用。

        5
  •  4
  •   TNTDoctor    12 年前

    psyco死了,不能再维持下去了。是时候再找一个了

        6
  •  3
  •   Andrew Szeto    15 年前

    一个人不应该依靠某种魔法子弹来解决你的问题。通常不需要使用psyco使慢速程序更快。坏的算法会被重写,而 要求 速度可以用另一种语言写。当然,你的问题问我们为什么不用它来提高速度,当你用psyco的时候会有一些开销。psyco使用内存,这两行只是排序 感觉 就像你看到它们时的头顶。至于我为什么不使用psyco的个人原因,是因为它不支持x86_64,我认为这是一种新兴的体系结构(尤其是2038年前后即将到来)。我的选择是派比,但我也不完全喜欢。

        7
  •  2
  •   Jason Baker    15 年前

    其他一些事情:

    1. 它似乎没有得到很积极的维护。
    2. 它可能是一个记忆之猪。
        8
  •  1
  •   Ali Afshar    15 年前

    很简单:“因为代码已经运行得足够快了”。