我必须使用cython编写一个小模拟程序,通常可以使用numba进行加速。 但由于numba不支持我想要使用的scipy函数来修改函数,所以我不得不做出这个转变。
因此,我已经将我的模拟程序翻译成了cython,与numba相比,一切都变得非常缓慢。也许我的cython代码存在瓶颈,我没有看到。
我的cython代码:
import numpy as np
cimport numpy as cnp
cimport cython
cnp.import_array()
@cython.boundscheck(False)
@cython.wraparound(False)
def simulation(int N=10000, int N_save=10000):
cdef cnp.ndarray[double] x = np.empty(N_save, dtype=np.double)
cdef cnp.ndarray[double] r = np.random.standard_normal(size=N_save)
cdef fs = int(N / N_save)
cdef xold = 0
x[0] = 0
for i in range(1, N):
if i%N_save == 0:
r = np.random.standard_normal(size=N_save)
xnew = xold + r[i%N_save]
if (i % fs) == 0:
x[int(i / fs)] = xnew
xold = xnew
return x
我用于编译的代码:
from setuptools import setup
from Cython.Build import cythonize
import numpy as np
setup(
ext_modules=cythonize(
"test.pyx",
compiler_directives={'language_level' : "3"},
),
include_dirs=[np.get_include()]
)
用Numba加速的相同代码:
@nb.jit(nopython=True, fastmath=True)
def simulation_nb(N=10000, N_save=10000):
x = np.zeros(N_save)
r = np.random.standard_normal(size=N_save)
fs = int(N / N_save)
xold = 0
x[0] = 0
for i in range(1, N):
if i%N_save == 0:
r = np.random.standard_normal(size=N_save)
xnew = xold + r[i%N_save]
if (i % fs) == 0:
x[int(i / fs)] = xnew
xold = xnew
return x
< p >使用模拟数据(N=1000000,N_save=10000)的基准测试结果如下:< /p>
< ol >
为什么我的Cython代码几乎和原生Python一样慢?
cython -a
会生成一个带注释的 HTML 文件,它将为您提供有关可能效率低下的提示。 - DavidW