python – Cython中用于循环调用的快速基本线性代数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Cython中用于循环调用的快速基本线性代数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1846字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试在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中有没有新的方法来进行这种操作? (因此我不认为这是重复的)或者您是否找到了更好的方法来处理我尚未见过的这类问题?
强制性代码示例:
(这只是一个例子,当然它仍然可以改进,但只是为了提出这个想法)
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
谢谢!!
tl; dr:如何在cython中使用线性代数?
解决方法:
答案you link to仍然是从Cython调用BLAS函数的好方法.它实际上不是一个python包装器,仅仅使用Python,因此获取指向该函数的C指针,这可以在初始化时完成.所以你应该得到基本上类似C的速度.我可能是错的,但我认为即将推出的Scipy 0.16版本将提供一个方便的BLAS Cython API,基于这种方法,它不会改变性能方面.
如果你在移植到Cython之后没有经历过反复调用BLAS函数的任何加速,那么在numpy中执行此操作的python开销无关紧要(例如,如果计算本身是最昂贵的部分)或者你做错了什么(不必要的记忆副本等)
我想说这种方法应该比使用GSL更快更容易维护,前提是您使用优化的BLAS(OpenBLAS,ATLAS,MKL等)编译scipy.
内容总结
以上是互联网集市为您收集整理的python – Cython中用于循环调用的快速基本线性代数全部内容,希望文章能够帮你解决python – Cython中用于循环调用的快速基本线性代数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。