在我们之前的文章中,我们讲了几种计算斐波那契数列的方法,其中基于递归的方法是最慢的,比如计算第40项值,它需要36秒。如下图所示:要提高计算速度,根本的办法当然是改进算法。但是,算法的改进是一个长期积累和启发的过程。今天我们要说的是一个省心又立竿见影的方法——将Python代码编译成C语言代码。以C语言的效率加速计算。这个过程看起来很复杂,但实际上你不需要写一行C代码。您需要做的就是使用名为Cython的库将Python代码编译为C语言代码。首先我们安装Cython,就像安装一个普通的第三方库:python3-mpipinstallcython安装完成后,我们单独写一个计算斐波那契数列的函数:defib(n):ifnin[1,2]:return1returnfib(n-1)+fib(n-2)很简单的递归写法。那么关键来了,我们要把这个文件保存为fast_fib.pyx。注意后缀是.pyx。如下图:然后我们创建一个setup.py文件,文件内容如下:fromsetuptoolsimportsetupfromCython.Buildimportcythonizesetup(ext_modules=cythonize('fast_fib.pyx'))如下图:这个函数file是调用Cython的cythonize函数将Python代码转换为C代码。接下来开始编译代码,执行如下命令:python3setup.pybuild_ext--inplace我的Python是Python3.7,所以运行完成后会生成一个fast_fib.cpython-37m-darwin.so。如果你的Python是3.8,这个文件名可能是fast_fib.cpython-38m-darwin.so。您可以更改此文件的名称,例如更改为fast_fib.so。还有一个名为fast_fib.c的文件。但是你不需要打开这个文件,因为它有3200多行。你甚至可以直接删除它。只有这个fast_fib.cpython-38m-darwin.so文件才是真正有用的。您需要做的就是直接调用您的函数。我们再创建一个文件test_fast_fib.py,内容如下:importtimefromfast_fibiimportfibstart=time.time()result=fib(40)end=time.time()print(f'斐波那契数列的第40项是:{result},耗时:{end-start}秒')运行效果如下图所示:计算斐波那契数列第40项仅需5秒,速度妥妥是Python版的7倍.使用Cython不仅可以提高程序的运行速度,还可以通过反编译将你的核心代码转成.so文件,防止别人看到你的代码。关于Cython的更多信息,请阅读它的官方文档[1]可能有同学会问,既然当前文件夹下有一个fast_fib.pyx文件,为什么我们执行fromfast_fibimportfib的时候,不从这个文件导入fibImportPython版本的代码?这是因为import只会从后缀为.py/.pyc/.pyo/.so的文件中导入模块,而不会在.pyx文件中搜索它们。
