Kopien einer Liste, implicit sharing?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten