【问题标题】:Will compiling python files to cython speed up the program? [closed]将 python 文件编译为 cython 会加速程序吗? [关闭]
【发布时间】:2016-04-02 22:39:01
【问题描述】:

如果我将我的 python 文件编译为 cython,我会看到速度提高吗?还是我需要在 cython 中重写我的代码才能真正看到改进?

我在下面这样做。

python convert_to_cython.py build_ext --inplace

【问题讨论】:

  • 要获得cython 的最佳改进,您需要阅读cython 文档。关于使用 cython 获得预期改进的问题和答案有很多。研究那些。
  • 另外,我不明白你的例子应该做什么。 convert_to_cython.py 是什么?看起来您将 setup.py file for a distutils extension 与您的实际 Python 源代码混淆了。

标签: python cython


【解决方案1】:

就目前而言,这个问题过于宽泛,因为答案很大程度上取决于您的 Python 代码是什么样的。如果没有看到它,或者至少不知道它的作用,就不可能给你一个直截了当的答案。

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

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

【讨论】:

    【解决方案2】:

    虽然这个问题很宽泛,但总的来说YES。它确实可以加快您的代码速度,有时甚至可以提高 100 倍。

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

    但是,对于性能关键的代码,添加静态类型声明通常很有帮助,因为它们可以让 Cython 摆脱 Python 代码的动态特性并生成更简单、更快的 C 代码 - 有时更快 数量级

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

    1. 静态类型变量
    2. 循环展开
    3. 分支预测

    等等。

    现在,Cython 广泛使用了 静态类型变量 的重要功能之一。由于 python 变量是无类型的,而 C 变量不是,Cython 可以让用户灵活地静态修复其变量的类型。

    在 Cython 文档 website 中,他们展示了仅提及类型实际上如何提高了 35% 的性能。

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

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

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

    再次引用 Cython 文档

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

    编辑 2 回答问题 或者我是否需要在 cython 中重写我的代码才能真正看到改进?

    ,因为 Cython 编译器会为您完成所有工作。

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

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

    欲了解更多信息,请访问this

    【讨论】:

    • 第一个引用与您的答案相矛盾。
    • @IgnacioVazquez-Abrams 第一条引述说,通过静态提及类型,它可以创建更快的可执行文件,我在回答中也提到了相同的内容。那我怎么反驳??
    • “或者我是否需要在 cython 中重写我的代码才能真正看到改进?”添加静态声明是重写它的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多