本文使用递归斐波那契数列的算法,可以直观得看出使用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倍的速度