Estoy probando Haskell para calcular las funciones de partición de los modelos en física estadística. Esto implica atravesar listas bastante grandes de configuraciones y sumar varios observables, lo que me gustaría hacer de la manera más eficiente posible.Haskell: lista/vector/matriz de ajuste del rendimiento
La versión actual de mi código está aquí: https://gist.github.com/2420539
Algunas cosas extrañas suceden cuando se trata de elegir entre las listas y vectores para enumerar las configuraciones; en particular, para truncar la lista, usando V.toList . V.take (3^n) . V.fromList
(donde V
es Data.Vector
) es más rápido que simplemente usar take
, lo que se siente un poco contrario a la intuición. En ambos casos, la lista se evalúa perezosamente.
La lista en sí está construida usando iterate
; si en vez utilizo Vector
s tanto como sea posible y construir la lista mediante V.iterateN
, de nuevo se vuelve más lenta ...
Mi pregunta es, ¿hay alguna manera (que no sea de empalme V.toList
V.fromList
y en lugares al azar en el código) para predecir cuál será el más rápido? (Por cierto, I compilar todo usando ghc -O2
con la versión estable actual.)
BTW '-funbox-strict-fields' ayudará a su tipo de datos de estadísticas. –
¡Sí! Aproximadamente un 10% más rápido en general ... Optimización de este tipo es divertido :-) –
BTW - Hice una implementación de referencia en C++, usando el mismo algoritmo de manera imperativa usando std :: vector. En mi computadora para n = 15, la versión de Haskell termina en 4.6 segundos, y la de C++ en aproximadamente 1.8 segundos. Diría que esto es bastante satisfactorio :-) –