2 回答

TA貢獻1982條經驗 獲得超2個贊
做一些時間測試
path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=False)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=True)
np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=path[0])
在我的測試中,第二個 2 以相同的速度運行。對于小問題optimize=False更快,大概是因為分析和重新排列需要時間。對于大問題,理論加速比更大,實際加速比True可能大于理論。據推測,內存管理正在減緩這種False情況。
該theoretical speedup就是這樣,僅僅基于一個估計FLOPS計數。只有當 FLOPS 在計算中占主導地位時,這才是正確的。
你也可以計時path計算。問題的大小將決定它的時間是總時間的一小部分還是大部分。

TA貢獻1874條經驗 獲得超12個贊
從源代碼
Theoretical Speedup = speedup = naive_cost / opt_cost
naive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)
因此,從這一點來看,要加快該過程,您需要降低FLOPS(每秒浮點運算)。由于樸素成本是未優化表達式的成本,因此您需要以這樣一種方式重寫您的表達式,即刪除與表達式相關的任何“垃圾”,同時在不更改表達式的基礎結構的情況下離開。
從你的問題來看,你正在做一些復雜的表達,這可能是不可能的。但是要回答你的問題,嘗試重寫你的表達式是一種更緊湊的方式,以獲得較低的理論加速。
您可以嘗試使用不同的路徑來降低您的 FLOPS。
添加回答
舉報