我将使用
这是我的Python代码:
这是我对应的Haskell代码:
有趣的是,
我的猜测是,与
请注意,我已经使用了
hashtables
包在Haskell中尝试使用哈希表,但发现无法达到Python的性能水平。如何实现类似的性能?当前的Haskell库和编译器是否支持?如果不支持,导致这种情况的根本问题是什么?这是我的Python代码:
y = {}
for x in xrange(10000000):
y[x] = x
print y[100]
这是我对应的Haskell代码:
import qualified Data.HashTable.IO as H
import Control.Monad
main = do
y <- H.new :: IO (H.CuckooHashTable Int Int)
forM_ [1..10000000] $ \x -> H.insert y x x
H.lookup y 100 >>= print
这里有另一个版本使用 Data.Map
,对我来说比两者都慢:
import qualified Data.Map as Map
import Data.List
import Control.Monad
main = do
let m = foldl' (\m x -> Map.insert x x m) Map.empty [1..10000000]
print $ Map.lookup 100 m
有趣的是,
Data.HashMap
的性能非常差:import qualified Data.HashMap.Strict as Map
import Data.List
main = do
let m = foldl' (\m x -> Map.insert x x m) Map.empty [1..10000000]
print $ Map.lookup 100 m
我的猜测是,与
Data.Map
不同,Data.HashMap
没有严格的脊骨(我想),所以 foldl'
只是一个带有相应的 thunk 累积问题的 foldl
,因此表现不佳。请注意,我已经使用了
-prof
并验证了大部分时间都花在了 hashtables
或 Data.Map
代码上,而不是在 forM
或类似代码上。所有代码都使用 -O2
编译,没有其他参数。
Data.Map
而不是专门针对整数键的Data.IntMap
? - alternativeInt
类型,因此默认使用较大且速度较慢的任意精度Integer
。 - AndrewC