【问题标题】:Performance optimizations of Python with Cython使用 Cython 对 Python 进行性能优化
【发布时间】:2020-05-17 05:53:55
【问题描述】:

我在学习 Python 时遇到了一种叫做 Cython 的东西,它有助于提高性能。后来,我发现了 Instagram 开发者的演讲 https://www.youtube.com/watch?v=_1MSX7V28Po,在他的演讲中,他说 Cython 在 Python 优化方面确实很有帮助。但简要提到,如果你只是添加 Cython 很好,但如果你为你的 python 代码添加类型注释。您可以获得更好的性能。所以,问题是,通过添加 cython 是否真的可以提升性能,但是如果我们为 python 代码添加 TYPE ANNOTATIONS,那么性能提升会更好吗?

【问题讨论】:

  • Cython 中的类型化变量不同于 Python 类型注解
  • 在 Cython 中使用 Cython 类型的变量将提供性能优势。 typing 风格的类型注解没有性能优势;在最坏的情况下,它们实际上可能会减慢您的代码速度。
  • @juanpa.arrivillaga,我的意思是,如果我们使用 cython 的类型系统,与仅在我们的 python 代码中添加 cython 而不使用它的类型系统相比,它会给我们带来额外和更好的性能提升吗?
  • 是的,这就是 Cython 的重点
  • 花时间阅读cython 文档。教程和博客只给你建议,而不是真正的交易。一开始,不要在所有代码中抛出 cython。专注于一些真正需要速度提升的功能。如果过早切换到编译版本,可能会失去 Python 的很多灵活性。

标签: python cython


【解决方案1】:

看看documentation 我想我们可以回答你的问题。

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

没有类型注释的示例:

def f(x):
    return x ** 2 - x


def integrate_f(a, b, N):
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx

在 Cython 中简单地编译它只会提供 35% 的加速。这总比没有好,但是添加一些静态类型可以产生更大的差异。

类型注释示例:

def f(double x):
    return x ** 2 - x


def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f(a + i * dx)
    return s * dx

由于迭代器变量 i 是使用 C 语义键入的,因此 for 循环将被编译为纯 C 代码。键入 a、s 和 dx 很重要,因为它们涉及 for 循环中的算术;键入 b 和 N 差别不大,但在这种情况下,保持一致并键入整个函数并不需要太多额外的工作。

这使得速度比纯 Python 版本快 4 倍。

因此看来,仅使用 Cython 确实提供了性能提升,而添加类型注释提供了更多的性能提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多