Próbuję użyć tabel mieszania w Haskell z hashtables
package i stwierdzenie, że nie mogę uzyskać w pobliżu wydajności Pythona. Jak mogę osiągnąć podobną wydajność? Czy jest to możliwe, biorąc pod uwagę obecne biblioteki i kompilatory Haskella? Jeśli nie, jaki jest podstawowy problem?Haskell Hashtable Performance
Oto mój kod Python:
y = {}
for x in xrange(10000000):
y[x] = x
print y[100]
Oto mój odpowiedni kod 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
Oto kolejna wersja użyciu Data.Map
, które jest wolniejsze niż zarówno dla mnie:
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
Co ciekawe, Data.HashMap
działa bardzo źle:
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
Podejrzewam, że Data.HashMap
wykonuje źle, ponieważ w odróżnieniu Data.Map
, nie jest Mrożąca ścisłe (chyba), więc foldl'
tylko foldl
, związanych z tym problemów thunk wodnej.
Zauważ, że użyłem -prof
i sprawdzeniu, że większość czasu jest spędzić w kodzie hashtables
lub Data.Map
, a nie na forM
lub coś podobnego. Cały kod jest kompilowany z -O2
i nie ma innych parametrów.
Którą godzinę otrzymujesz? – jamshidh
Używając 'nowego', czasy to 2 i 10-15 sekund; używając 'newSized', jak zasugerowano w odpowiedzi poniżej, są to 2 i 4. –
FYI- Właśnie wypróbowałem to na moim komputerze .... około 10 sekund dla kodu' Data.HashTable.IO', około 1 sekundy dla python i 3 sekundy dla 'Data.Map'. – jamshidh