Ich habe ein Python-Programm, das viel mit Wörterbüchern arbeitet. Ich muss tausende Male Kopien von Wörterbüchern machen. Ich benötige eine Kopie der Schlüssel und der zugehörigen Inhalte. Die Kopie wird bearbeitet und darf nicht mit dem Original verknüpft werden (z. B. dürfen Änderungen an der Kopie keine Auswirkungen auf das Original haben.)
Schlüssel sind Zeichenfolgen, Werte sind Ganzzahlen (0/1).
Ich benutze derzeit einen einfachen Weg:
newDict = oldDict.copy()
Das Profilieren meines Codes zeigt, dass der Kopiervorgang die meiste Zeit in Anspruch nimmt.
Gibt es schnellere Alternativen zur dict.copy()
Methode? Was wäre am schnellsten?
python
performance
dictionary
copy
Joern
quelle
quelle
bool
eine bessere Wahl als einint
?bool
in Pythonint
sowieso nicht benannt .bool
Typ tatsächlich eine Unterklasse (Subtyp?) Desint
Typs.Antworten:
Wenn Sie sich die C-Quelle für die Python-
dict
Operationen ansehen, können Sie sehen, dass sie eine ziemlich naive (aber effiziente) Kopie erstellen. Es läuft im Wesentlichen auf einen Anruf anPyDict_Merge
:Auf diese Weise wird schnell überprüft, ob es sich um dasselbe Objekt handelt und ob Objekte darin enthalten sind. Danach führt es eine großzügige einmalige Größenänderung / Zuordnung zum Ziel-Diktat durch und kopiert dann die Elemente nacheinander. Ich sehe nicht, dass du viel schneller wirst als der eingebaute
copy()
.quelle
Anscheinend ist dict.copy schneller, wie Sie sagen.
quelle
timeit
‚s-s
Argument:python -m timeit -s "from copy import copy" "new = copy({1:1, 2:2, 3:3})"
. Wenn Sie schon dabei sind, ziehen Sie auch die Diktat-Erstellung heraus (für alle Beispiele)Können Sie ein Codebeispiel bereitstellen, damit ich sehen kann, wie Sie copy () verwenden und in welchem Kontext?
Du könntest benutzen
Aber ich glaube nicht, dass es schneller gehen wird.
quelle
Mir ist klar, dass dies ein alter Thread ist, aber dies ist ein hohes Ergebnis in Suchmaschinen für "Diktierkopie-Python" und das Top-Ergebnis für "Diktierkopie-Leistung", und ich glaube, dass dies relevant ist.
Ab Python 3.7
newDict = oldDict.copy()
ist es bis zu 5.5x schneller als zuvor. InsbesonderenewDict = dict(oldDict)
scheint diese Leistungssteigerung derzeit nicht zu verzeichnen.Es gibt ein wenig mehr Informationen hier .
quelle
Abhängig von den Dingen, die Sie der Spekulation überlassen, möchten Sie möglicherweise das ursprüngliche Wörterbuch einpacken und eine Art von Wörterbuch erstellen Copy-on-Write durchführen.
Die "Kopie" ist dann ein Wörterbuch, das Dinge im "übergeordneten" Wörterbuch nachschlägt, wenn es nicht bereits den Schlüssel enthält - sondern Änderungen an sich.
Dies setzt voraus, dass Sie das Original nicht ändern und dass die zusätzlichen Suchvorgänge nicht mehr kosten.
quelle
Die Messungen hängen jedoch von der Wörterbuchgröße ab. Für 10000 Einträge sind copy (d) und d.copy () fast gleich.
quelle