【问题标题】:Call np.sqrt in cython在 cython 中调用 np.sqrt
【发布时间】: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]

标签: python numpy cython


【解决方案1】:

一般来说,当 Cython 看到一个 python 函数调用时,它被视为一个不透明的操作。 Cython 可能会省略一些调用开销,但否则它将生成与从 python 调用该函数完全相同的语义。

Cython 编译器对某些 numpy 构造(例如 ndarray[dtype] 类型)进行了特殊处理,以生成更高效的代码。 numpy ufuncs 不是,所以对 cython np.sqrt 来说只是另一个 python 函数,所以它只能回调到 python 中运行它。

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

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多