%%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
我有如上所述的用于计算平方根和的代码。
通过使用cython -a
,我得到了如图所示的结果。
cython代码在函数调用np.sqrt(i)
上与python交互,与纯python代码相比没有任何改进。
我不知道在指定变量类型时是否做错了什么。
还有其他解决方案,例如使用i**(1/2)
或从sqrt
导入函数clib
,但我想了解为什么cython在这种情况下不能编译np.sqrt。
谢谢。
答案 0 :(得分:1)
通常,当Cython看到python函数调用时,会将其视为不透明操作。 Cython可能会消除一些调用开销,但否则它将生成与从python调用该函数完全相同的语义。
Cython编译器对某些特定的numpy构造(例如ndarray[dtype]
类型)进行了特殊处理,以生成更有效的代码。 numpy的ufunc并不是,所以cython np.sqrt
只是另一个python函数,因此它没有比调用python运行它更好的了。
其他python加速器,例如numba
将拦截对np.sqrt
的调用,并将其重写为等效的低级代码。