代码我们在同文件夹下新建一个 update.pyx 文件写入如下内容1234567891011121314151617181920212223242526272829303132333435importnumpy as npcimport numpy as npcimport cythonDTYPEnp.floatctypedef np.float_t DTYPE_tdefupdate_state(np.ndarray[DTYPE_t, ndim2] cells):returnupdate_state_c(cells)cython.boundscheck(False)cython.wraparound(False)cdef np.ndarray[DTYPE_t, ndim2] update_state_c(np.ndarray[DTYPE_t, ndim2] cells):更新一次状态cdef unsignedinticdef unsignedintjcdef np.ndarray[DTYPE_t, ndim2] bufnp.zeros((cells.shape[0], cells.shape[1]), dtypeDTYPE)cdef DTYPE_t neighbor_numforiinrange(1, cells.shape[0]-1):forjinrange(1, cells.shape[0]-1):# 计算该细胞周围的存活细胞数neighbor_numcells[i, j-1]cells[i, j1]cells[i1, j]cells[i-1, j]\cells[i-1, j-1]cells[i-1, j1]\cells[i1, j-1]cells[i1, j1]ifneighbor_num3:buf[i, j]1elifneighbor_num2:buf[i, j]cells[i, j]else:buf[i, j]0returnbufupdate_state_c 函数上的两个装饰器是用来关闭 Cython 的边界检查的。在同文件下新建一个 setup.py 文件123456789importnumpy as npfromdistutils.coreimportsetupfromCython.Buildimportcythonizesetup(nameCython Update State,ext_modulescythonize(update.pyx),include_dirs[np.get_include()])因为在 Cython 文件中使用了 NumPy 的头文件所以我们需要在 setup.py 将其包含进去。执行 python setup.py build_ext --inplace 后同文件夹下会生成一个 update.cp36-win_amd64.pyd 的文件这就是编译好的 C 扩展。我们修改原始的代码首先在文件头部加入 import update as cupdate然后修改更新方法如下1234defupdate_state(self):更新一次状态self.cellscupdate.update_state(self.cells)self.timer1将原方法名就改为 update_state_py 即可运行脚本无异常。测速我们编写一个方法来测试一下使用 Cython 可以带来多少速度的提升123456789101112131415deftest_time():importtimegameGameOfLife(cells_shape(60,60))t1time.time()for_inrange(300):game.update_state()t2time.time()print(Cython Use Time:, t2-t1)delgamegameGameOfLife(cells_shape(60,60))t1time.time()for_inrange(300):game.update_state_py()t2time.time()print(Native Python Use Time:, t2-t1)运行该方法在我的电脑上输出如下Cython Use Time: 0.007000446319580078Native Python Use Time: 4.342248439788818速度提升了 600 多倍。以上就是本文的全部内容希望对大家的学习有所帮助