Python科学计算(第2版)
上QQ阅读APP看书,第一时间看更新

1.3.7 提高运算速度

Python的动态特性虽然方便了程序的开发,但也会极大地降低程序的运行速度。使用Cython可以将添加了类型声明的Python程序编译成C语言源代码,再编译成扩展模块,从而提高程序的运算速度。使用Cython既能实现C语言的运算速度,也能使用Python的所有动态特性,极大地方便了扩展库的编写。

下面是按照前面介绍的公式使用循环计算π的源程序,使用cdef关键字定义变量的类型,从而提高程序的运行效率:

    %%cython
    import cython
    
    @cython.cdivision(True)
    def calc_pi(int n):
        cdef double pi = 0
        cdef int i
        for i in range(1, n, 4):
            pi += 4.0 / i
        for i in range(3, n, 4):
            pi -= 4.0 / i
        return pi

调用calc_pi()来计算的近似值:

    calc_pi(1000000)
    3.141590653589821

下面使用%timeit比较calc_pi()和NumPy库来计算的运算时间:

    n = 1000000
    %timeit calc_pi(n)
    %timeit np.sum(4.0 / np.r_[1:n:4, -3:-n:-4])
    100 loops, best of 3: 3.9 ms per loop
    100 loops, best of 3: 5.94 ms per loop