Cython:使用类型化内存视图时,Cython 用户是否应该实现自己的 "vector" 函数库?

Cython: when using typed memoryviews, are Cython users supposed to implement their own library of "vector" functions?

如果我正在使用类型化的内存视图,并且我想添加我使用此类内存视图表示的两个向量,或者获取它们的点积或其他此类向量的东西,Cython 是否希望我在我自己的?

我对此没有问题,但我想知道如果我正忙着写 add vectors/multiply by a scalar/dot products/etc 是不是我做错了什么。靠我自己。感觉像是一种反模式,但我不确定。

什么是正确的模式?

如果您的代码在线性代数函数或向量化运算上花费了大量时间,那么它可能不是 Cythonizing 的理想选择。

numpy 数组之间的点积通常使用已经高度优化的 BLAS 库调用执行,如果您尝试在 Cython* 中重新发明轮子,您肯定会做得更糟。类似地,基本的向量化操作(例如添加两个向量)对于 numpy 数组已经非常有效,尽管在某些情况下,在 Cython 中可能做得更好(例如,通过利用并行化,或通过避免中间数组分配)。

Cython 对于加速不容易矢量化的操作最有用,否则您将不得不求助于 Python for 循环等。最好的方法通常是识别和Cython 仅解决这些瓶颈,而不是尝试在 Cython 中重写所有内容。


*话虽如此,可以通过将指针传递到数组中的第一个元素来直接在类型化内存视图上调用 BLAS 或 LAPACK 函数(有关某些示例,请参见 here and here)。

请注意,您实际上可以将内存视图传递给大多数 numpy 函数。当然你仍然支付 Python 调用开销,但是如果 memoryview 很大,这可能是微不足道的。示例:

cdef double[:,:] A
# ... initialize A ...
x = np.sum(A)