関数型プログラミング言語Haskell Part34 (667レス)
関数型プログラミング言語Haskell Part34 http://mevius.5ch.net/test/read.cgi/tech/1639713446/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
592: デフォルトの名無しさん [] 2024/11/09(土) 18:32:16.19 ID:r4DlAvJp mylist.py TotalSeconds : 6.1246778 1:def mylist(n, m): 2: a = 1 3: outer = [] 4: for _ in range(0, n): 5: inner = [] 6: for _ in range(0, m): 7: inner.append(a) 8: a += 1 9: outer.append(inner) 10: return outer 11: 12:print(mylist(6000, 8000)[-1][-1]) 上と同じ動きのコードを書いたけど、 アルゴリズムとしてはPythonと同じmylist.hsのコードが良いはずなのに、 どっちも最適化するとmylist2.hsのが良好。 (ファイル名の横の秒数は実行時間) mylist.hs TotalSeconds : 4.107899 1:main = print.last.last $ mylist 6000 8000 2: 3:mylist n m = take n.f $ [1..] 4: where f ns = xs:f ys 5: where (xs, ys) = splitAt m ns mylist2.hs TotalSeconds : 2.3916408 1:main = print.last.last $ mylist 6000 8000 2: 3:mylist n m = take n.iterate f $ [1..m] 4: where f = map (+m) http://mevius.5ch.net/test/read.cgi/tech/1639713446/592
593: デフォルトの名無しさん [] 2024/11/09(土) 18:32:43.47 ID:r4DlAvJp mylist2.hsのアルゴリズムは f = map (+3)とすれば [1,2,3] [4,5,6] -- f [1,2,3] = [1 + 3, 2 + 3, 3 + 3] = [4,5,6] [7,8,9] -- f (f [1,2,3]) = f [1 + 3, 2 + 3, 3 + 3] = [4 + 3, 5 + 3, 6 + 3] = [7,8,9] と、行数が増えるごとに関数の適用回数が増えるので本来なら遅いはずですが、 考えるに直前の結果をキャッシュする様な最適化が施された模様。(-O3) (そうすると、mylist.hsのsplitAtの方がボトルネックになる?) 最適化なしでのコンパイルはしてないので、 もしかしたらiterateの中身自身がキャッシュするように改良されたのかも。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/593
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.027s