Cython:在使用类型化内存视图时,我应该使用np.float_t而不是double吗?

9

关于cython中的memoryviews,如果我正在使用numpy浮点数组,使用NumPy类型(如np.float_t)对视图进行类型化是否比简单地使用double有任何优势?

如果我要使用cdef,那么应该以相同的方式进行类型化,例如:

ctypedef np.float64_t np_float_t
...

@cython.profile(False)
@cython.wraparound(False)
@cython.boundscheck(False)
cdef np_float_t mean_1d(np_float_t [:] v) nogil:
    cdef unsigned int n = v.shape[0]
    cdef np_float_t n_sum = 0.

    cdef Py_ssize_t i
    for i in range(n):
        n_sum += v[i]

    return n_sum / n
1个回答

17
如果你查看与Cython一起提供的numpy头文件(例如在主分支中,它是__init__.pxd),你会发现
    ctypedef double       npy_double

ctypedef npy_double     float_t

换句话说,float_t就是double,因此使用np.float_t没有任何优势。


我找到了它...第311/758行 :| 关于类型的使用:何时最好使用Py_ssize_t进行索引?(在文档中,我只发现了“纯粹主义者可以使用“Py_ssize_t”,这是数组索引的适当Python类型。”)-> 这是否意味着无论何时索引NumPy/Cython-Array(s)/-views等都应该使用它? - embert
你应该发起一个关于如何使用 Py_ssize_t 的新问题,而不是留下评论。这样可以确保它得到最广泛的关注。 - Warren Weckesser
1
你说得对。这样也更容易为其他寻求答案的人找到。大多数时候,我怀疑是否值得将其作为一个独立的问题提出来。不过,从现在开始我会努力这样做的。 - embert
1
我在这里提了一个新问题,关于Py_ssize_t的使用。 - embert
好的。我刚想在这里评论答案是“是的”——但很难找到一个明确的陈述。 - Warren Weckesser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接