【Python】疯狂的加速函数!
作者:杰少
einsum函數
簡介
在平時的工作中,包括時間序列等的建模中,我們常常會涉及到線性或者Multilinear代數的計算,很多時候包括我在內也喜歡偷懶使用numpy來處理,個人覺得還是可以的,但有的朋友覺得這個看起來可讀性會差一些,并且速度上也差一些,今天就推薦一個新的函數einsum函數。
通過einsum函數,我們可以寫出可讀性更好,更加高效的函數。
einsum函數
01
關于einsum函數
einsum函數一般會用于向量,矩陣,張量的計算中。
如果輸入的是標量(scalar),我們就可以空著,因為它沒有下標。
02
einsum函數優勢
1.速度優勢
因為numpy很多是用C寫的。
如果我們使用Python循環時,所有數據操作都在Python解釋器中進行。
當使用內置numpy函數時,它發生在C中,這就是numpy速度更快的原因。
使用einsum時,numpy會在C中處理數據一次并返回最終結果,而使用多個numpy函數會花費更多時間返回多個值。
2.可讀性優勢
einsum的代碼可讀性會更強,能大大提高代碼的可讀性和效率。
代碼
比較循環,numpy中的其它函數,einsum
從下面的案例中,我們發現einsum比numpy快樂將近30倍,比循環快了500-600倍。
import?numpy?as?npA?=?np.random.rand(1000,1000) B?=?np.random.rand(1000,1000)%%time #?Using?loops s?=?0 n,?m?=?A.shape for?i?in?range(n):for?j?in?range(m):s?+=?A[i,?j]*B[i,?j]? s#?CPU?times:?user?596?ms,?sys:?5.79?ms,?total:?602?ms #?Wall?time:?607?ms #?249760.77497519302CPU times: user 596 ms, sys: 5.79 ms, total: 602 ms Wall time: 607 ms 249760.77497519302%%time #?Using?built-in?numpy?functions np.trace(np.dot(A.T,?B))#?CPU?times:?user?113?ms,?sys:?8.54?ms,?total:?121?ms #?Wall?time:?38.1?ms #?249760.7749751993CPU times: user 113 ms, sys: 8.54 ms, total: 121 ms Wall time: 38.1 ms 249760.7749751993%%time #?Using?einsum np.einsum('ij,ij->',?A,B)#?CPU?times:?user?1.64?ms,?sys:?689?μs,?total:?2.33?ms #?Wall?time:?1.19?ms #?249760.7749751993CPU times: user 1.64 ms, sys: 689 μs, total: 2.33 ms Wall time: 1.19 ms 249760.7749751993適用問題
所有涉及到矩陣,向量,張量等計算的問題。
參考文獻
Write Better And Faster Python Using Einstein Notation
總結
以上是生活随笔為你收集整理的【Python】疯狂的加速函数!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】Python语言学习:p
- 下一篇: win8消费者预览版Chrome无法设置