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

4
如果我使用了typed memoryviews,想要对用该memoryview表示的两个向量进行加法、点积或其他向量操作,Cython是否期望我自己实现这些函数?
我不反对这样做,但我想知道如果我忙于编写向量加法/标量乘法/点积等操作,是否做错了什么。感觉这是一种反模式,但我不确定。
正确的方法是什么?
2个回答

9
如果你的代码在线性代数函数或向量化操作上花费了大量时间,那它可能不是Cython的好选择。numpy数组之间的点积通常使用BLAS库调用执行,这已经非常高度优化,如果您尝试在Cython中重新发明轮子,您几乎可以保证做得更差。同样,对于numpy数组,基本的向量化操作例如两个向量相加已经非常高效,虽然在某些情况下,可能可以在Cython中做得更好(例如通过利用并行化或避免中间数组分配等)。Cython最有用的是加速不能轻松向量化的操作,否则您将不得不使用Python for循环等。通常最好的方法是仅识别和Cython化这些瓶颈,而不是试图在Cython中重写所有内容。

话虽如此,可以通过将指向数组中第一个元素的指针传递给类型化的memoryview直接调用BLAS或LAPACK函数(请参见这里这里以获取一些示例)。


3
请注意,你实际上可以将 memoryviews 传递给大多数 numpy 函数。当然,你仍需要支付 Python 调用开销,但是如果 memoryview 很大,则这可能是微不足道的。例如:
cdef double[:,:] A
# ... initialize A ...
x = np.sum(A)

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