【发布时间】:2018-11-08 20:23:51
【问题描述】:
%%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)或者从clib导入函数sqrt,但是我想了解一下为什么在这种情况下cython无法编译np.sqrt。
谢谢。
【问题讨论】:
-
我很好奇,
i**(1/2)会编译成更快的解决方案吗? -
是的,它不与python交互。
-
从here 读取,我推断
np.sqrt只是想要一个python int 对象,所以Cython 除了创建一个来获得结果之外别无他法。 -
有时对
cimport numpy as cnp有意义,然后很明显哪些函数是慢速的常用python 功能(您必须通过np.xxxx调用它,例如np.sqrt),哪些函数是快速cython (通过cnp.xxx调用,例如cnp.ndarray[cnp.float64_t])