在cython中呼叫np.sqrt

时间:2018-11-08 20:23:51

标签: 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

cython -a

我有如上所述的用于计算平方根和的代码。 通过使用cython -a,我得到了如图所示的结果。 cython代码在函数调用np.sqrt(i)上与python交互,与纯python代码相比没有任何改进。

我不知道在指定变量类型时是否做错了什么。 还有其他解决方案,例如使用i**(1/2)或从sqrt导入函数clib,但我想了解为什么cython在这种情况下不能编译np.sqrt。

谢谢。

1 个答案:

答案 0 :(得分:1)

通常,当Cython看到python函数调用时,会将其视为不透明操作。 Cython可能会消除一些调用开销,但否则它将生成与从python调用该函数完全相同的语义。

Cython编译器对某些特定的numpy构造(例如ndarray[dtype]类型)进行了特殊处理,以生成更有效的代码。 numpy的ufunc并不是,所以cython np.sqrt只是另一个python函数,因此它没有比调用python运行它更好的了。

其他python加速器,例如numba将拦截对np.sqrt的调用,并将其重写为等效的低级代码。