我正在尝试用Cython编写一个蒙特卡洛模拟函数。该函数涉及多个小的线性代数运算,如点积和矩阵求逆。由于该函数被调用了成千上万次,NumPy的开销占据了大部分成本。
三年前有人提出了这个问题:calling dot products and linear algebra operations in Cython? 我已经尝试使用两个答案的建议,但第一个scipy.linalg.blas仍然通过python包装器,我并没有真正获得任何改进。第二个使用gsl包装器也相当慢,并且在向量维度非常大时往往会冻结我的系统。我还发现了Ceygen软件包,看起来非常有前途,但似乎安装文件在最后的Cython更新中损坏了。
另一方面,我发现scipy正在为lapack开发Cython包装器,但它看起来仍然不可用 (scipy-cython-lapack) 最后,我也可以为这些运算编写自己的C程序,但这似乎有点重复造轮子。
总之,为了总结:有没有一种新的在Cython中进行这种操作的方法?(因此我认为这不是副本)或者您已经找到了一种更好的处理这种问题的方法,我还没有看到吗?
代码示例:(这只是一个示例,当然它仍然可以改进,但只是为了给出思路)
三年前有人提出了这个问题:calling dot products and linear algebra operations in Cython? 我已经尝试使用两个答案的建议,但第一个scipy.linalg.blas仍然通过python包装器,我并没有真正获得任何改进。第二个使用gsl包装器也相当慢,并且在向量维度非常大时往往会冻结我的系统。我还发现了Ceygen软件包,看起来非常有前途,但似乎安装文件在最后的Cython更新中损坏了。
另一方面,我发现scipy正在为lapack开发Cython包装器,但它看起来仍然不可用 (scipy-cython-lapack) 最后,我也可以为这些运算编写自己的C程序,但这似乎有点重复造轮子。
总之,为了总结:有没有一种新的在Cython中进行这种操作的方法?(因此我认为这不是副本)或者您已经找到了一种更好的处理这种问题的方法,我还没有看到吗?
代码示例:(这只是一个示例,当然它仍然可以改进,但只是为了给出思路)
cimport numpy as np
import numpy as np
cpdef double risk(np.ndarray[double, ndim=2, mode='c'] X,
np.ndarray[double, ndim=1, mode='c'] v1,
np.ndarray[double, ndim=1, mode='c'] v2):
cdef np.ndarray[double, ndim=2, mode='c'] tmp, sumX
cdef double ret
tmp = np.exp(X)
sumX = np.tile(np.sum(tmp, 1).reshape(-1, 1), (1, tmp.shape[0]))
tmp = tmp / sumX
ret = np.inner(v1, np.dot(X, v2))
return ret
谢谢!
简短概述:如何在Cython中实现线性代数?
tokyo
了吗? - ali_m.pxd
头文件来公开所需的特定例程。 - ali_mC
中完整地写出代数表达式。 - hpaulj