Seite 1 von 1

Kopien einer Liste, implicit sharing?

Verfasst: Samstag 9. Januar 2010, 11:42
von Panke
Moin,

ich hab gar keinen Anwendungsfall im Hinterkopf, aber ich habe mich
gerade gefragt, ob Python copy-on-write unterstützt, wenn ich eine Liste kopiere.

Also sowas z.B.:

Code: Alles auswählen

a = range(10000)
b = a[:] # wie hoch ist der Aufwand, wenn ich auf b nur lesend zugreife?
c = copy.deepcopy(a) # gleiche Frage?
Gruß, Panke

Verfasst: Samstag 9. Januar 2010, 11:52
von sma
Python "unterstützt", was in der Sprach- und Bibliotheksbeschreibung steht. AFAIK wird da zu diesem Thema nichts gesagt. Was man sagen könnte ist, dass ab Python 3.x `range` nicht mehr eine Liste erzeugt, wie es zuvor der Fall war und `[:]` darauf nicht mehr funktioniert.

Was die einzelnen Implementierungen machen, um zu optimieren, ist eine andere Frage. Ich würde raten, dass `[:]` sofort eine Kopie zieht, denn das macht die Leseoperationen schneller, da man jetzt nicht jedes Mal testen muss, ob man sich die Liste teilt. Andererseits, schnelle Slice-Operationen sind auch nicht zu verachten. Dennoch würde ich in meiner eigenen Implementierung nur für tuple die zugrunde liegenden Daten teilen.

Da deep copy rekursiv vorgeht, kann es allgemein nicht schneller sein, als die shallow copy durch `[:]` und hier würde sich copy-on-write auch nur für die Blätter des möglichen Baums lohnen.

Stefan