Ich versuche, Hash-Tabellen in Haskell mit der hashtables
package zu verwenden, und zu finden, dass ich nicht in der Nähe von Pythons Leistung kommen kann. Wie kann ich ähnliche Leistungen erzielen? Ist es möglich, aktuelle Haskell-Bibliotheken und Compiler zu geben? Wenn nicht, was ist das zugrunde liegende Problem?Haskell Hashtable Leistung
Hier ist meine Python-Code:
y = {}
for x in xrange(10000000):
y[x] = x
print y[100]
Hier ist mein entsprechenden Code 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
Hier ist eine andere Version ist Data.Map
verwenden, die für mich langsamer als beide ist:
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
Interessanterweise funktioniert Data.HashMap
sehr schlecht:
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
Mein Verdacht ist, dass Data.HashMap
schlecht ab, weil im Gegensatz zu Data.Map
, ist es nicht wirbelsäulen streng (glaube ich), so foldl'
ist nur ein foldl
, mit den damit verbundenen thunk Aufbauproblemen.
Bitte beachte, dass ich verwendet habe -prof
und bestätigt, dass die Mehrheit der Zeit verbringt, ist in dem hashtables
oder Data.Map
Code, nicht auf den forM
oder so etwas. Der gesamte Code ist mit -O2
und anderen Parametern kompiliert.
Welche Zeiten bekommen Sie? – jamshidh
Mit "neu" sind die Zeiten 2 und 10-15 Sekunden; mit 'newSize', wie in der Antwort unten vorgeschlagen, sind sie 2 und 4. –
FYI- Ich habe es gerade auf meinem Rechner versucht .... etwa 10 Sekunden für den' Data.HashTable.IO' Code, etwa 1 Sekunde für die Python und 3 Sekunden für 'Data.Map'. – jamshidh