Cython 的加速对比
使用了cython加速
# do the primes, with the cython
def primes_cdef(int nb_primes):
cdef int n,i,len_p #进行了底层变量定义
cdef int p[100] #数组初始化
if nb_primes>1000:
nb_primes=1000
len_p=0
n=2
while len_p <nb_primes:
for i in p[:len_p]:
if n% i==0:
break
else:
p[len_p]=n
len_p+=1
n+=1
result_as_list =[prime for prime in p[:len_p]]
return result_as_list
没用使用的cython的加速
可以看到cdef来定义变量
import numpy as np
def primes(n_primes):
p=np.empty(1000) ''' 使用numpy进行array初始化'''
if n_primes>1000:
n_primes=1000
len_p=0
n=2
while len_p<n_primes:
for i in p[:len_p]:
if n% i==0:
break
else:
p[len_p]=0
len_p+=1
n+=1
result_as_list=[prime for prime in p[:len_p]]
return result_as_list
黄色加粗部分就是Python与C的交互部分,颜色越深,交互程度越多,由此可见 cython进行加速的部分为中间循环与迭代, 没有使用cytyhon的部分 发现,python参与的部分更多
#运行速度对比
加速对比:
速度 | cython | 非cython |
---|---|---|
1.96 usec/loop | 160 usec/loop |
代码&指令参考
from distutils.core import setup
from Cython.Build import cythonize
import time
import pyximport
setup(name='Hello app',ext_modules=cythonize('hello.pyx',annotate=True))
指令
$ python exampleC.py build_ext --inplace
$ python3 -m timeit -s "import hello " "hello.primes_cdef(30)"
P.S.
cdef 定义函数时不可直接调用 需要在def之下 进行二调 不然变异会出错