У меня есть такие функции, как :
millionsOfCombinations = [[a, b, c, d] |
a <- filter (...some filter...) someListOfAs,
b <- (...some other filter...) someListOfBs,
c <- someListOfCs, d <- someListOfDs]
aLotOfCombinationsOfCombinations = [[comb1, comb2, comb3] |
comb1 <- millionsOfCombinations,
comb2 <- millionsOfCombinations,
comb3 <- someList,
...around 10 function calls to find if
[comb1, comb2, comb3] is actually useful]
Оценка миллионов комбинаций
занимает 40 секунд. на очень быстрой рабочей станции. Оценка aLotOfCombinationsOfCombinations
!! 0 заняла 2 дня: - (
Как я могу ускорить этот код? Пока у меня было 2 идеи - использовать профилировщик. Пробовал запустить myapp + RTS - sstderr
после компиляции с GHC, но получаю пустой экран и не хочу ждать несколько дней, пока он закончится.
Вторая мысль заключалась в том, чтобы каким-то образом кэшировать миллионы комбинаций
. Правильно ли я понимаю, что для каждое значение в aLotOfCombinationsOfCombinations
, illionOfCombinations
оценивается несколько раз? Если это так, как я могу кэшировать результат? Очевидно, я только начал изучать Haskell. выполнять кэширование вызовов с помощью монады, но я все еще не понимаю этих вещей.