use*_*321 7 python numpy cython
%%cython
import numpy as np
cimport numpy as np
def cy_sum(int n):
cdef double s=0
cdef int i
for i in range(n):
s += np.sqrt(i)
return s
Run Code Online (Sandbox Code Playgroud)
我有如上所述计算平方根之和的代码.通过使用cython -a,我得到了图片中的结果.cython代码在函数调用时与python交互np.sqrt(i),与纯python代码相比没有任何改进.
我不知道在指定变量类型时是否做错了.还有其他的解决方案,如使用i**(1/2)或导入功能sqrt从clib,但我想明白为什么用Cython不能在这种情况下,编译np.sqrt.
谢谢.
一般来说,当 Cython 看到 python 函数调用时,它被视为不透明操作。Cython 可能会消除一些调用开销,但否则它将生成与从 python 调用该函数完全相同的语义。
某些 numpy 构造(例如类型ndarray[dtype])由 Cython 编译器进行特殊处理,以生成更高效的代码。numpy ufuncs 不是,所以对于 cythonnp.sqrt只是另一个 python 函数,所以它除了回调 python 来运行它之外什么也做不了。
其他Python加速器,例如numba将拦截调用np.sqrt并将其重写为等效的低级代码。