Cython:当使用类型化的内存视图时,Cython用户是否应该实现自己的“向量”函数库?

时间:2015-03-09 17:28:33

标签: python numpy cython

如果我正在使用类型化的内存视图,并且我想添加两个我使用这样的内存视图表示的向量,或者使用它们的点积或其他类似的向量,Cython是否希望我自己实现这些函数?

我对此没有任何问题,但是我想知道如果我正在忙于编写添加向量/乘以标量/点积等等,我是否做错了。靠我自己感觉就像反模式,但我不确定。

什么是正确的模式?

2 个答案:

答案 0 :(得分:8)

如果您的代码在线性代数函数或向量化操作中花费了大量时间,那么它可能不是Cythonizing的一个很好的候选者。

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

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


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

答案 1 :(得分:1)

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

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