Frage

Gerade jetzt, ich bin Pufferung Bytes mit Streichern, StringIO oder cStringIO. Aber, ich brauche oft Bytes von der linken Seite des Puffers zu entfernen. Ein naiver Ansatz würde den gesamten Puffer wieder aufzubauen. Gibt es eine optimale Art und Weise, dies zu tun, wenn linksAbschneide eine sehr häufige Operation ist? Python Garbage Collector tatsächlich sollte das abgeschnittene Bytes GC.

Jede Art von Algorithmus für diesen (halten Sie den Puffer in kleinen Stücken?) Oder eine vorhandene Implementierung würde wirklich helfen.

Edit:

Ich habe versucht, Python 2.7 ist memoryview für diesen Einsatz, aber leider werden die Daten außerhalb der „Sicht“ ist nicht GCed, wenn die ursprüngliche Referenz gelöscht wird:

# (This will use ~2GB of memory, not 50MB)

memoryview # Requires Python 2.7+

smalls = []

for i in xrange(10):
    big = memoryview('z'*(200*1000*1000))
    small = big[195*1000*1000:]
    del big
    smalls.append(small)
    print '.',
War es hilfreich?

Lösung

deque effizient sein wird, wenn linksEntfernungsVorgänge sind häufige (im Gegensatz zu einer Liste, eine Schnur oder Puffer verwendet wird, ist es amortisiert O (1) entweder für-End-Entfernung). Es wird teurer Speicher weise als eine Zeichenfolge jedoch, wie jedes Zeichen als seine eigene String-Objekt zu speichern werde, anstatt eine gepackte Folge.

Alternativ können Sie Ihre eigene Implementierung erstellen (z. B. eine verknüpfte Liste von String / Pufferobjekte fester Größe), die die Daten kompakt mehr speichern kann.

Andere Tipps

Erstellen Sie Ihre Puffer als eine Liste von Zeichen oder Linien und die Liste in Scheiben schneiden. kommt nur als String auf Ausgang. Das ist ziemlich effizient für die meisten Arten von ‚wandelbar string‘ Verhalten.

Der GC wird das abgeschnittene Bytes sammeln, weil sie nicht mehr in der Liste verwiesen werden.

UPDATE: Für die Liste Kopf modifizieren können Sie einfach die Liste umkehren. Das klingt wie ein ineffizientes, was jedoch der Pythons zu tun Liste Implementierung optimiert intern dies.

http://effbot.org/zone/python-list.htm:

  

Umkehren ist schnell, so vorübergehend   Umkehren der Liste häufig beschleunigen kann   Dinge, wenn Sie entfernen müssen und   legen Sie eine Reihe von Einzelteilen an der   Anfang der Liste:

L.reverse()
# append/insert/pop/delete at far end
L.reverse()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top