
文章插图
在我们以前的文章中,曾经讲过计算斐波那契数列的几种方法,其中基于递归的方法是速度最慢的,例如计算第40项的值,需要36秒 。如下图所示:

文章插图
要提高运算速度,根本办法当然是改进算法 。不过算法的提高是一个长期积累加上灵机一动的过程 。我们今天要讲的,是一个不费脑筋,立竿见影的方法——把 Python 代码编译成 C 语言代码 。通过 C 语言的运行效率来加速计算过程 。
【一招把你的 Python 代码提速7倍】这个过程看起来很复杂,但实际上你并不需要编写一行 C 语言代码 。你需要做的只是使用一个叫做 Cython 的库把 Python 代码编译为 C 语言代码即可 。
首先我们来安装 Cython,就像安装普通的第三方库一样:
python3 -m pip install cython安装完成以后,我们单独写计算斐波那契数列的函数:def fib(n):if n in [1, 2]:return 1return fib(n - 1) + fib(n - 2)非常简单的递归写法 。然后关键来了,我们要把这个文件保存为fast_fib.pyx 。注意后缀是.pyx 。如下图所示:
文章插图
然后我们创建一个
setup.py文件,文件内容如下:from setuptools import setupfrom Cython.Build import cythonizesetup(ext_modules=cythonize('fast_fib.pyx'))如下图所示:
文章插图
这个文件的作用,就是调用 Cython 的
cythonize函数把 Python 代码转换为 C 代码 。接下来,开始编译代码,执行如下命令:
python3 setup.py build_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,内容如下:import timefrom fast_fib import fibstart = time.timeresult = fib(40)end = time.timeprint(f'斐波拉契数列第40项为:{result},耗时:{end - start}秒')运行效果如下图所示:
文章插图
计算斐波那契数列第40项只需要5秒钟,速度妥妥变成 Python 版本的7倍 。
使用 Cython,不仅可以提高程序的运行速度,还可以把你的核心代码转换为
.so文件,防止别人反编译看到你的代码 。关于 Cython 的更多介绍,请阅读它的官方文档[1]
有同学可能会问,当前文件夹下面既然有
fast_fib.pyx文件,为什么当我们执行from fast_fib import fib的时候,不会从这个文件里面导入 Python 版本的代码?这是因为,
import只会从后缀为.py/.pyc/.pyo/.so的文件中导入模块,不会进入.pyx文件中寻找 。官方文档:
推荐阅读
- 想把头条运营好,就不要碰这5点
- 如何将你的代码可视化?
- 电竞座椅避坑指南,老玩家集齐六把椅子,手把手教你如何选购
- 做红烧肉时,最忌焯水和用水炖,大厨教你一招,肥而不腻超下饭
- 太极拳让你的生理和精神得到双丰收
- 电脑小知识:windows10 系统激活的方法,抛弃你的未激活版本吧!
- 把车借给别人开,违章扣分怎么算,是扣车主的分还是驾驶者的分?
- 你的社保卡有多少钱?别还不知道,教你几招查询方法
- 床头柜的风水作用不可小觑 你的家里肯定有它
- 长命的动物是什么生肖?
