编译C代码

可能获得哪种类型的速度提升

编译后趋于更快运行的 Python 代码有可 能是数学方面的,并且可能有许多循环在重复着多次相同的运算。在这些循环中, 有可能会生成许多临时对象。

只有当被编译的代码主要是 Python(并且可能主要是循 环)时才会运行得更快

JIT 和 AOT 编译器的对比

  • 提前编译(AOT), 你会创建一个为你的机器定制的静态库。如果你下载了 numpy、scipy 或 scikit-learn,它就会在你的机器上用 Cython 编译部分的 库(或者如果你正在使用像 Continuum’s Anaconda 之类的分发包,你就会使用一个 事先构建的预编译库)。通过在使用之前编译的方式,你就会获得一个能够在工作 中立即拿来使用来解决你的问题的库。

  • 即时编译 冷启动:通过即时编译,你不必提前做很多(如果有的话),你让编译器在使用时只逐步编 译恰到好处的那部分代码。如果你的大部分 代码能够被编译并且当前都还没有被编译过,当你开始运行代码而且正在被编译 时,就会跑得很慢。如果这事在你每次运行脚本时都发生,并且你运行这脚本很多 次,开销就会变得很显著。

Cython

In pyx

1
2
3
4
5
def fib(n):
    cdef double a = 0.0, b = 1.0
    for i in range(n):
        a, b = a + b, a
    return a

导入pyx

1
2
3
4
5
import pyximport

pyximport.install()

from xx import fib