Haskell Hashtable-Leistung

7

Ich versuche Hashtabellen in Haskell mit dem hashtables -Paket zu verwenden und zu finden, dass ich nirgendwohin komme in der Nähe von Pythons Leistung. 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?

Hier ist mein Python-Code:

%Vor%

Hier ist mein entsprechender Haskell-Code:

%Vor%

Hier ist eine andere Version mit Data.Map , die langsamer ist als beides für mich:

%Vor%

Interessanterweise funktioniert Data.HashMap sehr schlecht:

%Vor%

Mein Verdacht ist, dass Data.HashMap schlecht abschneidet, denn im Gegensatz zu Data.Map ist es nicht rückgratsicher (denke ich), also ist foldl' nur ein foldl mit den dazugehörigen Thunk-Buildup-Problemen.

Beachten Sie, dass ich -prof verwendet habe und überprüft habe, dass die meiste Zeit im Code hashtables oder Data.Map verbracht wird, nicht im forM oder ähnlichem. Der gesamte Code wird mit -O2 und anderen Parametern kompiliert.

    
Andrew Gibiansky 05.11.2014, 19:15
quelle

3 Antworten

10

Wie reddit.com/u/cheecheeo hier vorgeschlagen hat, verwenden Sie Data.Judy , werden Sie ähnliche Leistung für Ihre spezielle Microbenchmark erhalten:

> %Vor%

Timeout oben:

%Vor%

Timing des Python-Codes von OP:

%Vor%     
user4222027 06.11.2014 09:22
quelle
8

Die Dokumentation für hashtables stellt fest, dass "Cuckoo Hashing, wie die grundlegende Implementierung der Hashtabelle mit linearer Abtastung, auch möglich ist leiden lange Verzögerungen, wenn die Tabelle in der Größe geändert wird. " Sie verwenden new , wodurch eine neue Tabelle der Standardgröße erstellt wird. Aus der Quelle , es scheint, dass die Standardgröße 2 ist. Das Einfügen von 10000000 Elementen führt wahrscheinlich zu zahlreichen Anpassungen.

Versuchen Sie es mit newSized .

    
Christian Conkle 05.11.2014 19:20
quelle
2

Angesichts der oben genannten Zeiten dachte ich, ich würde die Lösung Data.Map einwerfen, was mit der Verwendung von newSize vergleichbar zu sein scheint.

%Vor%     
jamshidh 05.11.2014 19:39
quelle

Tags und Links