我在我的應用程序,做了很多工作,並佔據了大部分的計算時間一個很簡單的功能:加快Data.Array行提取和過濾
f :: Int -> Array (Int,Int) Int -> [Int]
f x arr = [v | v <- range (l,u), vv <- [g!(x,v)], vv /= 0]
where ((_,l), (_,u)) = bounds arr
這樣做是:提取一行索引x
來自數組arr
並返回所有列索引與元素\= 0
。所以,舉例來說,給出界限((0,0),(2,2))
以下矩陣:
arr = [[0, 0, 5],
[4, 0, 3],
[0, 3, 1]] -- for simplicity in [[a]] notation
預期的輸出是
f 0 arr == [2]
f 1 arr == [0,2]
f 2 arr == [1,2]
如何加快f
和更詳細的個人資料究竟需要大部分的計算時間在f(列表構造,數組訪問等)?
謝謝!
我剛剛檢查了庫的源代碼,'range'應該和'[..]'一樣。 – sclv
@sclv是的,它是一樣的。然而,編譯器必須剝離更多層。 「Int」應該沒有問題,但可能適用於其他類型。 –
感謝您的評論。這確實有助於很多,我認爲問題在於列表的構建。我最終需要的是對列表的摺疊,所以最好直接在調用者中對數組進行摺疊。 – bbtrb