首页 > 解决方案 > 使用 Cython 对 Python 进行性能优化

问题描述

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

标签: pythoncython

解决方案


看看文档,我想我们可以回答你的问题。

但是,对于性能关键代码,添加静态类型声明通常很有帮助,因为它们将允许 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 确实提供了性能提升,并且添加类型注释提供了更多的性能提升。


推荐阅读