Tengo una función muy simple en mi aplicación que hace un montón de trabajo y ocupa más tiempo de cálculo:Acelerar Data.Array extracción y filtrado de fila
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
Lo que esto hace es: extraer una fila en índice x
de la matriz arr
y devuelve todos los índices de columnas con los elementos \= 0
. Así, por ejemplo, dada la siguiente matriz con límites ((0,0),(2,2))
:
arr = [[0, 0, 5],
[4, 0, 3],
[0, 3, 1]] -- for simplicity in [[a]] notation
la salida esperada es
f 0 arr == [2]
f 1 arr == [0,2]
f 2 arr == [1,2]
¿Cómo puedo acelerar f
y el perfil con más detalle lo que realmente lleva la mayor parte del tiempo de cálculo en f (construcción de la lista, acceso a la matriz, etc.)?
¡Gracias!
Acabo de comprobar el origen de las bibliotecas y 'range' debe ser igual que' [..] '. – sclv
@sclv Sí, es lo mismo. Sin embargo, es una capa más que el compilador tiene que despegar. No debería haber problema con 'Int', pero puede ser para otros tipos. –
Gracias por tu comentario. Esto realmente ayudó bastante y creo que el problema es la construcción de la lista. Lo que realmente necesito al final es un pliegue sobre la lista, por lo que podría ser mejor doblar la matriz directamente en la persona que llama. – bbtrb