2015-12-22 2 views
5

Sagen wir, ich werde ein wahrscheinlich großes Wörterbuch in Python 3 für In-Memory-Operationen erstellen. Die Dictionary Keys sind Integer, aber ich werde sie zuerst als String aus einer Datei lesen.Trade-off in Python-Wörterbuch Schlüsseltypen

Was das Speichern und Abrufen betrifft, frage ich mich, ob es wichtig ist, ob ich die Wörterbuchschlüssel als ganze Zahlen oder als Strings speichern soll.
Mit anderen Worten, würde sie als Ganzzahlen verlassen mit Hashing?

+0

Welchen Vorteil hätte das Speichern der Werte als Zeichenfolge anstelle von int, wenn sie Ganzzahl darstellen? Dies ist die beste Lösung, wenn Sie überall komplizierten Code wie 'my_dict [str (my_val)] haben wollen. Wenn es sich um Ganzzahlen handelt, verwenden Sie "int", unabhängig davon, wie Sie Informationen in Ihren Dateien speichern. – Holt

+1

Verwenden Sie Ganzzahlen, wenn Sie sie später als Ganzzahlen verwenden, verwenden Sie Zeichenfolgen, wenn Sie sie später als Zeichenfolgen verwenden. – poke

+0

@poke Antwort ist am genauesten denke ich – Ramast

Antwort

1

Eigentlich ist der String Hashing ziemlich effizient in Python 3. ich dies erwartet hat das entgegengesetzte Ergebnis:

>>> timeit('d["1"];d["4"]', setup='d = {"1": 1, "4": 4}') 
0.05167865302064456 
>>> timeit('d[1];d[4]', setup='d = {1: 1, 4: 4}') 
0.06110116100171581 
3

Dicts schnell sind, aber auf dem Speicher schwer sein. Normalerweise sollte es kein Problem sein, aber Sie werden nur wissen, wenn Sie testen. Ich würde empfehlen, zuerst 1.000 Zeilen, 10.000 Zeilen und so weiter zu testen und einen Blick auf den Speicherbedarf zu werfen.

Wenn Sie nicht genügend Speicher haben und Ihre Datenstruktur es erlaubt, versuchen Sie es vielleicht mit named tuples.

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 
import csv 
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 
    print(emp.name, emp.title) 

(Beispiel von der Verbindung genommen)

Wenn Sie ganze Zahlen haben aufsteigend Sie auch mit der array module mehr Lust zu bekommen könnten versuchen.

1

Sie scheinen nicht die Benchmarking der Alternativen gestört zu haben. Es stellt sich heraus, dass der Unterschied ziemlich gering ist und ich auch inkonsistente Unterschiede finde. Außerdem ist ein Implementierungsdetail, wie es implementiert wird, da sowohl Integer als auch Strings unveränderlich sind, könnten sie möglicherweise als Zeiger verglichen werden.

Was Sie beachten sollten, ist die natürliche Wahl des Schlüssels. Wenn Sie den Schlüssel beispielsweise nirgends als Zahl interpretieren, gibt es keinen Grund, ihn in eine ganze Zahl zu konvertieren.

Darüber hinaus sollten Sie überlegen, ob Sie Schlüssel gleich betrachten wollen, wenn ihr numerischer Wert derselbe ist oder wenn sie lexikalisch identisch sein müssen. Zum Beispiel, wenn Sie 00 den gleichen Schlüssel wie 0 betrachten würden, müssten Sie es als Integer interpretieren und dann ist Integer der richtige Schlüssel, wenn Sie andererseits sie als unterschiedlich betrachten möchten, wäre es völlig falsch, sie in Ganzzahlen zu konvertieren (wie sie dann gleich werden würden).

Verwandte Themen