In einem Kommentar erwähnt das OP Bloat "in der Datenbank" - aber keine Informationen darüber, über welche Datenbank er spricht; Aus den wenigen Informationen in diesem Kommentar scheint es, dass Python-String-Slices nicht unbedingt das sind, was involviert ist, sondern das "Slicen" würde von der DB-Engine beim Abrufen ausgeführt werden.
Wenn das die tatsächliche Situation ist dann würde ich auf allgemeine Prinzipien gegen das Speichern von redundanten Informationen in der DB empfehlen - eine "normale Form" (vielleicht in einem laxen Sinn des Ausdrucks ;-) wobei Informationen nur einmal gespeichert und abgeleitet werden Informationen werden neu berechnet (oder Cache-Ladung der DB-Engine, etc ;-) sollte die Norm sein, und "Denormalisierung" durch absichtliche Speicherung abgeleiteter Informationen sehr stark die Ausnahme und nur, wenn durch spezifische, gut bemessene Retrieval-Performance-Anforderungen gerechtfertigt.
Wenn der Verweis auf "Datenbank" eine Fehlleitung war ;-), oder eher in einem laxen Sinn wie ich für "normale Form" oben verwendet habe; dann kann eine andere Überlegung gelten: Da Python-Strings unveränderlich sind, Es scheint natürlich zu sein, dass man keine Schnitte durch Kopieren machen muss, sondern dass jede Scheibe einen Teil des Speicherplatzes des Elternteils, von dem sie geschnitten wird, wiederverwenden kann (ähnlich wie es bei scheibenförmigen Arrays der Fall ist). Dies ist jedoch nicht Teil des Python-Kerns. Ich habe einmal einen Patch für diesen Zweck versucht, aber das Problem, einen Verweis auf den großen String hinzuzufügen und ihn so im Speicher zu halten, nur weil ein winziger Teilstring davon immer noch referenziert wird, war für die allgemeine Anpassung groß. Dennoch wäre es möglich, eine spezielle Unterklasse von Zeichenfolgen (und eine von Unicode) für den Fall zu erstellen, in dem die große "Eltern" Zeichenfolge sowieso im Speicher bleiben muss. Derzeit buffer
macht ein kleines bisschen davon, aber Sie können String-Methoden für ein Pufferobjekt nicht aufrufen (ohne explizit zu einem String-Objekt zuerst zu kopieren), so dass es nur für die Ausgabe und ein paar spezielle Fälle wirklich nützlich ist ... aber da ist kein wirklicher konzeptioneller Block gegen das Hinzufügen einer String-Methode (ich bezweifle, dass das im Core übernommen würde, aber es sollte trotzdem recht einfach als Drittanbieter-Modul zu pflegen sein ;-).
Der Wert eines solchen Ansatzes kann schwerlich durch Messung auf die eine oder andere Art und Weise bewiesen werden - die Geschwindigkeit wäre dem derzeitigen implizit kopierenden Ansatz sehr ähnlich; Der Vorteil wäre, den Speicherbedarf zu reduzieren, der zwar keinen Python-Code schneller machen würde, aber ein bestimmtes Programm auf einem Rechner mit etwas weniger RAM oder besser Multi-Task bei mehreren Instanzen ausführen könnte werden gleichzeitig in getrennten Prozessen verwendet. Ein ähnlicher, aber reichhaltigerer Ansatz wurde einmal im Kontext von C++ mit rope durchgespielt (aber beachten Sie, dass es nicht zum Standard wurde ;-).
Warum nicht einfach ausprobieren? Schreibe einen einfachen Test. –
stimme ich zu und wählte balpha, aber ich fragte mich immer, wie schnell das Python-Stück war. Ich benutze es die ganze Zeit so einfach wie eine einfache Zuweisung, aber ich bin mir sicher, dass es ziemlich viel langsamer ist. –
-1: habe kein Timing-Experiment durchgeführt. –