Ich baue eine Klasse mit ua einem Wörterbuch mit ganzzahligen Schlüsseln und Listenwerten. Das Hinzufügen von Werten zu diesem Wörterbuch scheint jedoch ein echter Flaschenhals zu sein und ich frage mich, ob es eine Möglichkeit geben könnte, meinen Code zu beschleunigen.Python: Optimaler Weg zum Wörterbuch mit Listenwerten
class myClass():
def __init__(self):
self.d = defaultdict(list)
def addValue(self, index, value):
self.d[index].append(value)
Ist das wirklich der optimale Weg? Ich interessiere mich nicht wirklich für die Reihenfolge der Werte, also gibt es vielleicht eine geeignetere Datenstruktur mit einem schnelleren Anhang. Andererseits scheint "append" nicht das Hauptproblem zu sein, denn wenn ich einfach an eine leere Liste angehängt habe, ist der Code viel schneller. Ich denke, dass das Laden der zuvor gespeicherten Liste die meiste Zeit in Anspruch nimmt?
Ich fand heraus, dass das Problem nicht in der dict ist, aber in der Liste append (obwohl ich sonst in meiner ursprünglichen Post behauptete, für die ich entschuldige ich). Dieses Problem ist auf einen Fehler in Pythons Garbage Collector zurückzuführen, der ausführlich unter this other question erläutert wird. Das Deaktivieren des GC vor dem Hinzufügen aller Werte und das anschließende erneute Aktivieren beschleunigen den Prozess immens!
Das Hinzufügen von Elementen zu einer Liste und das Abrufen von Werten von einem Objekt oder einem Diktat dauert keine Zeit. Um ein Programm zu beschleunigen, finden Sie den Engpass durch Profiling, nicht durch zufällige Code-Änderung. –
Ist die Zuordnung von Elementen zu vorhandenen Schlüsseln wesentlich schneller als das Hinzufügen von Werten zu neuen Schlüsseln? –
Ich habe gerade herausgefunden, dass das Problem nicht im Diktat liegt, sondern in der Liste anhängen (obwohl ich in meinem ursprünglichen Beitrag etwas anderes behauptet habe, wofür ich mich entschuldige). Dann fand ich die Antwort auf meine Frage auf http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressive-slower. Da ich neu auf dieser Seite bin, weiß ich nicht, was das Standardverfahren in diesem Fall ist: Soll ich meinen ursprünglichen Beitrag entfernen? Oder fügen Sie die obigen Details hinzu und antworten Sie auf den Beitrag? – niefpaarschoenen