Haskell: настройка производительности списка/вектора/массива

Я пытаюсь использовать Haskell для вычисления статистических сумм моделей в статистической физике. Это включает в себя обход довольно больших списков конфигураций и суммирование различных наблюдаемых, что я хотел бы сделать как можно эффективнее.

Текущая версия моего кода находится здесь: https://gist.github.com/2420539

Некоторые странные вещи происходят при попытке выбрать между списками и векторами для перечисления конфигураций; в частности, для усечения списка с помощью V.toList . V.взять (3^n) . V.fromList(где V— это Data.Vector) быстрее, чем просто использование take, что кажется немного нелогичным. В обоих случаях список оценивается лениво.

Сам список строится с помощью iterate; если вместо этого я максимально использую Vectors и создаю список, используя V.iterateN, снова он становится медленнее...

Мой вопрос в том, есть ли способ (кроме объединения V.toListи V.fromListв случайных местах кода), чтобы предсказать, какой из них будет самым быстрым? (Кстати, я компилирую все, используя ghc -O2с текущей стабильной версией.)

7
задан Don Stewart 19 April 2012 в 13:19
поделиться