【cython学习】分别使用python和cython运行斐波那契数列并计算时间

本文介绍使用Cython优化递归斐波那契数列算法的过程及显著提速效果,通过对比Python原生实现,Cython版本的运行速度提高了近100倍。

本文使用递归斐波那契数列的算法,可以直观得看出使用cython后明显的速度提升

具体代码如下


fib.c

#include<stdio.h>
#include "fib.h"

long int fib(int n)
{
    if(n == 0 || n == 1){
        return 1;
    }
    else{
        return (fib(n - 1) + fib(n - 2));
    }
}

fib.h

long int fib(int n);

Fibonacci.pyx

cdef extern from "fib.h":
    long int fib(int n)

def fibonacci(n):
    return fib(n)

setup.py

from distutils.core import setup, Extension
from Cython.Distutils import build_ext

setup(
    cmdclass={'build_ext': build_ext},
    ext_modules=[Extension("fibonacci_with_cython", sources=["Fibonacci.pyx", "fib.c"])]
)

运行setup.py进行编译

$ python setup.py build_ext -i

编译生成的文件:
分别为:bulid目录、Fibonacci.c 和 fibnacci_with_cython.cp36-win_amd64.pyd
编译结果


编写run.py文件进行速度测试:

from fibonacci_with_cython import fibonacci as fib_cython
import time

def fib_python(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib_python(n - 1) + fib_python(n - 2)


if __name__ == '__main__':
    t1 = time.time()
    print("python:斐波那契数列第40项的结果为:{}".format(fib_python(40)))
    t2 = time.time()
    print("使用python运行递归斐波那契数列程序的运行时间为: {}s".format(t2 - t1))

    t3 = time.time()
    print("cython:斐波那契数列第40项的结果为:{}".format(fib_cython(40)))
    t4 = time.time()
    print("使用cython运行递归斐波那契是咧程序的运行时间为: {}s".format(t4 - t3))

运行结果:
运行结果


可以看出cython比python快了将近100倍的速度
1. 安装cython 首先需要安装cython,可以通过pip安装: ```python pip install cython ``` 2. 编写Cython代码 Cython代码是Python代码的扩展,它允许Python代码C语言代码混合编写。Cython代码的文件扩展名是`.pyx`。 例如,我们有一个Python函数`fibonacci`,它计算斐波那契数列的第n个数: ```python def fibonacci(n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) ``` 我们可以使用Cython来加速这个函数,将它的代码保存在一个`fibonacci.pyx`文件中: ```python def fibonacci(int n): if n <= 1: return n else: return fibonacci(n-1) + fibonacci(n-2) ``` 在Cython代码中,我们需要指定参数的类型,这样可以减少Python解释器的开销。 3. 编写setup.py文件 在使用Cython之前,需要先将Cython代码编译成C语言代码,然后再编译成机器码。为了方便,我们可以编写一个`setup.py`文件来自动完成这个过程。 ```python from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("fibonacci.pyx") ) ``` `setup`函数接受一个`ext_modules`参数,它是一个包含Cython代码文件名的列表。`cythonize`函数将这些文件编译成C语言代码,生成一个扩展模块。 4. 编译Cython代码 在命令行中运行以下命令: ```python python setup.py build_ext --inplace ``` 这个命令将会生成一个名为`fibonacci.so`的共享库文件,它包含了Cython代码的机器码。 5. 使用Cython代码 在Python中导入这个共享库文件,使用其中的函数: ```python from fibonacci import fibonacci print(fibonacci(10)) ``` 输出结果为`55`,与原始Python代码的输出结果相同。 6. 测试性能 使用Python内置的`timeit`模块测试Cython代码原始Python代码的性能: ```python import timeit def test_python(): return fibonacci(30) def test_cython(): return fibonacci(30) print("Python:", timeit.timeit(test_python, number=100)) print("Cython:", timeit.timeit(test_cython, number=100)) ``` 输出结果类似于: ``` Python: 16.82980406400035 Cython: 0.2005062929999986 ``` 可以看到,使用Cython加速后的代码比原始Python代码快了约80倍。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值