Tôi có một chức năng rất đơn giản trong ứng dụng của tôi rằng hiện rất nhiều công việc và chiếm thời gian tính toán nhất:Tốc độ lên Data.Array khai thác hàng và lọc
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
Điều này không là: trích xuất một hàng tại chỉ số x
từ mảng arr
và trả về tất cả các chỉ mục cột có các thành phần \= 0
. Vì vậy, ví dụ, với ma trận sau đây với giới hạn ((0,0),(2,2))
:
arr = [[0, 0, 5],
[4, 0, 3],
[0, 3, 1]] -- for simplicity in [[a]] notation
sản lượng dự kiến là
f 0 arr == [2]
f 1 arr == [0,2]
f 2 arr == [1,2]
Làm thế nào để tăng tốc độ f
và hồ sơ với chi tiết hơn những gì thực sự mất phần lớn thời gian tính toán trong f (danh sách xây dựng, truy cập mảng, vv)?
Cảm ơn bạn!
Tôi vừa kiểm tra nguồn thư viện và 'dải ô' phải giống với' [..] '. – sclv
@sclv Vâng, nó giống nhau. Tuy nhiên đó là một lớp thêm trình biên dịch phải bóc vỏ. Nếu không có vấn đề gì với 'Int', nhưng có thể là do các loại khác. –
Cảm ơn bạn đã bình luận của bạn. Điều này thực sự đã giúp khá nhiều và tôi nghĩ rằng vấn đề là việc xây dựng danh sách. Những gì tôi thực sự cần cuối cùng là một lần trong danh sách, vì vậy nó có thể là tốt hơn để làm gấp trên mảng trực tiếp trong người gọi. – bbtrb