[英]How to multiply a sparse matrix by a sparse matrix element-wise in pytorch
[英]Efficient structure for element wise access to very large sparse matrix (Python/Cython)
我正在尋找一種有效的數據結構來表示Python / Cython中非常大的整數矩陣,重點關注元素操作。
我目前正在構建一個模型,該模型需要在大型高度稀疏矩陣上進行大量元素操作(在2MMx500k矩陣上讀取/寫入大約500億次)。 以前我在較小的數據上運行實驗,並使用Python與Cython和Numpy數組,並且理想情況下將繼續使用現有基礎結構的某些部分。
到目前為止我已查看/實施了許多選項。 它們可能沒有完全優化,但所有實現都應該足夠好,以便對每種方法的潛力給出切合實際的想法。 我已經通過創建一個2MMx500k矩陣進行測試,添加了25MM元素,然后再次刪除它們。 這反映了我需要的那種操作。
29 minutes: Cython lists to fill scipy.sparse.coo -> sparse.dok
10 minutes: Cython lists to fill scipy.sparse.coo -> sparse.lil
3 minutes: Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j]
3 minutes: Dict, s.t. A[(i,j)] contains M[i][j]
<1 minute: Dict, s.t. A[i*N,j] contains M[i][j]
<1 minute: <std::map> using Cython
到目前為止,黑客攻擊一個詞典表現最好,但仍然相當慢。 這也感覺太糟糕了,所以我假設必須有一個更有效的方法,特別是考慮到dict解決方案並沒有真正使用任何潛在的Cython可以提供。 是否有更多的Cythonic解決方案? 不幸的是,谷歌並沒有太大的幫助(或者我沒有正確的搜索關鍵詞)。
任何有關如何做到這一點的建議將不勝感激!
編輯1
兩個字典解決方案之間的區別在於A [“%d_%d”%(i,j)]變體訪問速度更快,而A [(i,j)]變體的設置速度更快。
Setup Execution
Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j] 180s 30s
Dict, s.t. A[(i,j)] contains M[i][j] 66s 104s
Dict, s.t. Dict, s.t. A[i*N,j] contains M[i][j] 40s 8s
雖然A [“%d_%d”%(i,j)]在當前測試中稍微慢一點,但從長遠來看,最好是因為設置成本只會增加10倍,執行成本為我的實際實驗因子10,000x。
編輯2
我可以通過刪除字符串操作來進一步加速字典版本,而是使用大整數表示,通過在第一個上使用適當大的乘數來連接兩個索引以避免沖突。 使用cdef輸入乘法:
cdef unsigned int key(int a, int b): return a * 10000000 + b
通過優化字典或將數據結構移動到C可能仍然可以進一步提高速度,但這應該足夠快以達到我的目的。 不過,任何其他建議仍然非常受歡迎! 如果我找到使用stl映射或類似數據結構的更有效的解決方案,將報告回來。
編輯3
根據同事的建議,我還使用<std::map>
通過它的Cython接口實現了系統,將數據存儲在<int,int>
映射中。 一旦我們擁有大量數據,實現實際上比dict
實現要慢一些,關鍵區別在於訪問速度:
Small data (25MM elements) Large data (250MM elements)
Time total setup read/write total setup read/write
Dict[int keys] 40s 25s 8s 369s 269s 72s
<std::map> 26s 11s 12s 376s 169s 177s
如果您沒有進行基於行或列的訪問,則可以使用帶有A[(i,j)]
等元組鍵的dict。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.