統計物理学のモデルの分配関数を計算するために Haskell を試しています。これには、構成の非常に大きなリストをトラバースし、さまざまなオブザーバブルを合計することが含まれます。これは、可能な限り効率的に行いたいと考えています。
私のコードの現在のバージョンはここにあります: https://gist.github.com/2420539
構成を列挙するためにリストとベクトルのどちらかを選択しようとすると、いくつかの奇妙なことが起こります。特に、リストを切り詰めるには、V.toList . V.take (3^n) . V.fromList
(where V
is Data.Vector
) を使用する方が を使用するよりも高速ですがtake
、これは少し直感に反するように感じます。どちらの場合も、リストは遅延評価されます。
リスト自体はiterate
;を使用して作成されます。代わりにVector
s を可能な限り使用し、 を使用してリストを作成するとV.iterateN
、再び遅くなります ...
私の質問は、どれが最も速いかを予測する方法 (スプライシングV.toList
とコード内のランダムな場所以外) はありますか? V.fromList
(ところで、ghc -O2
現在の安定版を使用してすべてをコンパイルします。)