编译python文件到cython会加速程序吗?

时间:2015-12-29 04:22:21

标签: python cython

如果我将python文件编译成cython,我会看到速度的提升吗?或者我是否需要在cython中重写我的代码以实际看到改进?

我在下面这样做。

exports

2 个答案:

答案 0 :(得分:3)

就目前而言,这个问题过于宽泛,因为答案很大程度上取决于Python代码的外观。没有看到它,或者至少知道它做了什么,它就不可能给你一个简单的答案。

如果您的代码主要调用其他编译库中的函数,那么您可能看不到任何改进,甚至更慢的运行时。例如,对于那些无法理解为什么Cython没有神奇地加速他们的numpy代码的人来说,有lots of questions。但是,嵌套的Python for循环之类的东西对于加速使用Cython非常有用。

您的第一步应始终是个人资料您的代码(例如,使用优秀的line_profiler)。一旦你确定了瓶颈所在的位置,你就可以考虑如何加速它们,可能是通过在Cython中重写它们。在Cython中重写所有现有的Python代码几乎肯定是浪费时间。

答案 1 :(得分:-2)

虽然这个问题相当广泛,但一般而言。它确实加速了你的代码,有时候大约为100。

作为参考, Cython 文档说,我引用

  

但是,对于性能关键代码,添加静态类型声明通常很有用,因为它们将允许Cython脱离Python代码的动态特性并生成更简单,更快速的C代码 - 有时更快 by数量级

像C / C ++这样的语言更快的主要原因是它们创建了与机器相关的汇编语言来调整所有与硬件相关的优化。这是使用编译器实现的,主要是因为很少有像

这样的东西
  1. 静态类型变量
  2. 循环展开
  3. 分支预测
  4. 等。

    现在,Cython广泛使用了静态类型变量这一重要特性之一。由于python变量是无类型的而C变量不是,因此Cython可以为用户提供静态修复变量类型的灵活性。

    在Cython doc website中,他们展示了如何通过提及实际产生 35%更快性能的类型。

    注意 但最后一句话是你在Cython中转换Python代码时要小心,因为你可能在项目中使用了一些不支持Cython的框架/ API 。有时即使你将你的代码转换成Cython,这几乎不会改变任何内部。所以这一切都取决于你的代码。

    因此首先要确保您在Python中完全可以移植Python代码,并检查是否绝对必要。

    编辑1 还有一件事是在Cython中转换代码会降低其可读性,因此请注意这一点。

    再次从Cython Docs引用

      

    但必须注意,类型声明可以使源代码更加冗长,从而降低可读性。因此不鼓励在没有充分理由的情况下使用它们,例如基准测试证明它们在性能关键部分确实使代码更快地实现了

    编辑2 回答问题或者我是否需要在cython中重写代码以实际看到改进?

    ,因为Cython编译器会为您完成整个过程。

      

    Cython编译器会将其转换为C代码,从而对Python / C API进行等效调用。

         

    由于Cython几乎可以接受任何有效的python源文件,因此入门中最困难的事情之一就是弄清楚如何编译你的扩展。

    有关详细信息,请访问this