Sto cercando di utilizzare le tabelle hash in Haskell con lo hashtables
package e trovo che non riesco ad andare da nessuna parte vicino alle prestazioni di Python. Come posso ottenere prestazioni simili? E 'possibile dare le attuali librerie e compilatori Haskell? In caso contrario, qual è il problema di fondo?Haskell Hashtable Performance
Ecco il mio codice Python:
y = {}
for x in xrange(10000000):
y[x] = x
print y[100]
Ecco il mio corrispondente codice 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
Ecco un'altra versione utilizzando Data.Map
, che è più lento di sia per me:
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
È interessante notare che Data.HashMap
si comporta molto male:
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
mio sospetto è che Data.HashMap
esegue male perché a differenza di Data.Map
, non è spina dorsale-rigida (credo), quindi foldl'
è solo un foldl
, con i problemi di accumulo tonfo associati.
Nota che ho usato -prof
e verificato che la maggior parte del tempo è passare nel codice hashtables
o Data.Map
, non sul forM
o qualcosa di simile. Tutto il codice è compilato con -O2
e nessun altro parametro.
Che ore hai? – jamshidh
Utilizzando 'new', i tempi sono 2 e 10-15 secondi; usando 'newSized' come suggerito nella risposta qui sotto, sono 2 e 4. –
FYI- Ho appena provato sul mio computer .... circa 10 secondi per il codice' Data.HashTable.IO', circa 1 secondo per il python e 3 secondi per 'Data.Map'. – jamshidh