如果我在同一個串列上應用map(只是一個例子,也可以是filter或其他東西)3次,Haskell是要通過這個串列3次還是只通過一次? 在ghci中運行的例子:
map ( 1) $ map (*2) $ map (^2) [1. .100]
我想知道的是,復雜度是3n,其中n是串列的大小,就像在命令式語言中一樣,還是Haskell中的懶惰將其優化為1n,只瀏覽一次串列,并同時對每個元素做三次操作。 所以,如果是1的話,它就會
- 將其提高到2
- 乘以2
- 加1
然后繼續下一個元素,而不是先瀏覽整個串列,同時將每個元素提高到2,然后再次瀏覽串列,將每個元素乘以,然后第三次瀏覽串列,將每個元素增加1。
那么,到底是哪一個呢? Haskell是要對串列進行3次檢查還是只檢查一次呢?
uj5u.com熱心網友回復:
你可以在ghci下做一個簡單的檢查:將統計模式設定為開啟,并嘗試以兩種方式運行運算式,但要有一個顯著的大小。對串列進行求和以強制進行完整的評估。
像這樣:
$ ghci
GHCi, version 8.8.4: https://www.haskell.org/ghc/ :? for help
λ>
λ> :設定 s
λ>
λ> n = 1000000[/span].
(0.00 secs, 24,296 bytes)
λ>
λ> sum ( map ( 1) $ map (*2) $ map (^2) [1.n] )
666667666668000000
(1.36秒, 865,692,136位元組)
λ>
λ> sum ( map ( (( 1) . (*2) . (^2)) [1...n] )
666667666668000000
(1.03秒, 753,692,056位元組)
λ>
因此,在使用優化的運算式時,有一些性能上的提升,但遠遠小于 3 倍。
當然,為了完整起見,你必須用用-O2編譯的GHC代碼來檢查:
$ myHaskellExe RTS -s -RTS。
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/308801.html
標籤:
