Ich habe diese einzigartige Anforderung, die durch diesen Code erklärt werden kann. Dies ist Arbeitscode, aber nicht speichereffizient.
data = [[
"A 5408599",
"B 8126880",
"A 2003529",
],
[
"C 9925336",
"C 3705674",
"A 823678571",
"C 3205170186",
],
[
"C 9772980",
"B 8960327",
"C 4185139021",
"D 1226285245",
"C 2523866271",
"D 2940954504",
"D 5083193",
]]
temp_dict = {
item: index for index, sublist in enumerate(data)
for item in sublist
}
print(data[temp_dict["A 2003529"]])
out: ['A 5408599', 'B 8126880', 'A 2003529']
Kurz gesagt, ich möchte, dass jedes Element der Unterliste indexierbar ist und die Unterliste zurückgibt.
Die obige Methode funktioniert, benötigt jedoch viel Speicher, wenn die Datenmenge groß ist. Gibt es einen besseren, speicher- und CPU-freundlichen Weg? Die Daten werden als JSON-Datei gespeichert.
Bearbeiten Ich habe die Antworten für das größtmögliche Anwendungsfall-Szenario ausprobiert (1000 Unterlisten, 100 Elemente in jeder Unterliste, 1 Million Abfragen). Hier sind die Ergebnisse (Mittelwert aus 10 Durchläufen):
Method, Time (seconds), Extra Memory used
my, 0.637 40 Mb
deceze, 0.63 40 Mb
James, 0.78 200 kb
Pant, > 300 0 kb
mcsoini, forever 0 kb
{item: sublist for sublist in data for item in sublist}
könnte etwas effizienter und direkter sein ...?!Antworten:
Sie befinden sich wirklich in einem Kompromiss zwischen der Zeit / dem Speicher, die zum Generieren des Wörterbuchs benötigt wird, und der Zeit, die zum Scannen der gesamten Daten für eine On-the-Fly-Methode benötigt wird.
Wenn Sie eine Methode mit geringem Arbeitsspeicher wünschen, können Sie eine Funktion verwenden, die jede Unterliste nach dem Wert durchsucht. Die Verwendung eines Generators führt zu schnelleren ersten Ergebnissen für den Benutzer. Bei großen Datenmengen ist dies jedoch zwischen den Rückgaben langsam.
Wie in den Kommentaren erwähnt, kann das Erstellen einer Hash-Tabelle, die nur auf dem ersten Buchstaben oder den ersten 2 oder 3 Zeichen basiert, ein guter Anfang sein. Auf diese Weise können Sie eine Kandidatenliste mit Unterlisten erstellen und diese dann scannen, um festzustellen, ob sich der Wert in der Unterliste befindet.
Das
quick_hash
Erstellen dieses Codes dauert einige Zeit, da Sie Ihre gesamte Datenstruktur scannen. Der Speicherbedarf wird jedoch viel kleiner sein. Ihr Hauptparameter für die Optimierung der Leistung istsize
. Kleinere Größen haben einen geringeren Speicherbedarf, dauern jedoch beim Ausführen länger,find_list_by_hash
da Ihr Kandidatenpool größer ist. Sie können einige Tests durchführen, um festzustellen, welches Rechtsize
für Ihre Daten gelten sollte. Denken Sie nur daran, dass alle Ihre Werte mindestens so lang sind wiesize
.quelle
Sie können so etwas ausprobieren:
Es ist keine Mapping-Struktur erforderlich.
quelle
Versuchen Sie dies mit Pandas
Dies sieht nach einer einfachen Lösung aus, selbst wenn Ihre Daten groß werden, wird dies effizient erledigt
quelle
df
: Es ist erheblich größer als die Listedata
(> x12) und das Diktattemp_dict
(~ x2) für die angegebenen Beispieldaten - nicht gerade speichereffizient, würde ich sagenpandas
dieses Problem effizienter behandelt wird als die integrierte Python-Funktionalität.pandas
wenn es mit verwendet werden kannstdlib
. Nur weil es schick aussieht?Ich bin mir nicht ganz sicher, wie sich dies bei größeren Datenmengen verhalten würde, aber Sie könnten Folgendes ausprobieren:
Bearbeiten: Scheint zeitlich nicht vorteilhaft zu sein, basierend auf einem Schnelltest mit einigen gefälschten Daten in größerem Maßstab.
quelle