Ist es möglich, in Python 3 mit buffer-ähnlichen (zeigerbasierten) String-Vergleichen zu sortieren?

8

Betrachten Sie das Problem der Sortierung aller Suffixe einer Zeichenfolge, wobei ein Suffix die Teilzeichenfolge von einem Index i bis zum Ende der Zeichenfolge ist. Anstatt eine Liste der sortierten Suffixe zu erstellen, können wir eine Liste der Indizes erstellen, die den Startpunkten der sortierten Suffixe entsprechen. Dann können wir so etwas tun:

%Vor%

Dies funktioniert für kurze Strings, aber wenn der String ausreichend lang ist, wird der Speicher knapp, weil die Schlüsselfunktion zu einer Kopie des Suffix führt und alle Schlüssel am Anfang generiert werden. In Python 2.7 gibt es einen glatten Weg, nämlich die Funktion puffer ():

%Vor%

In diesem Fall ist der Schlüssel nur ein Zeiger auf die Textzeichenfolge, so dass der gesamte benötigte Speicher viel weniger ist (O (n) vs O (n * n)). Daher wird es mit viel längeren Strings arbeiten. Dies funktioniert wunderbar in 2.7, aber in 3.x wurde die Funktion buffer () zugunsten von memoryview entfernt, was im Gegensatz zu Puffer nicht - AFAIK - zeigerbasierte Stringvergleiche unterstützt (dh ohne die tobytes-Methode zu verwenden), was eine Kopie der Zeichenfolge erstellt). Meine Frage ist: Gibt es eine Möglichkeit, etwas Ähnliches in Python 3.x zu tun?

    
user3065699 22.01.2014, 01:57
quelle

2 Antworten

2

Es sieht so aus, als würde MemoryView das nicht tun. Das könnte eigentlich eine gute Sache sein.

Sie können dies immer noch mit einer Klasse tun, die ohnehin objektorientierter ist:

%Vor%     
dstromberg 22.01.2014 02:48
quelle
0

Nun, ich habe auch an diesem Problem gearbeitet.

Und ich habe gerade von Python 2.7 auf 3. verschoben. WinPython, das übrigens einen sehr coolen Editor namens Spyder hat.

Soweit ich das beurteilen kann, sind MemoryView-Objekte völlig nutzlos.

Ich habe auch die itertools.islice-Funktion ausprobiert, konnte aber nicht sehen, wie das funktioniert.

So entschied ich mich, meine eigene kleine Vergleichsfunktion zu schreiben:

def suffixArrayCompare (x, y):      global globalText

%Vor%

Und es heißt so:

%Vor%

Das ist so schnell wie ich diesen Lauf machen kann. Es ist immer noch nicht so schnell wie der Puffer in 2.7, aber nicht zu weit weg. Und es kopiert nichts.

Dies

%Vor%

läuft fast so schnell, hat aber die Speicherprobleme, die Sie erwähnen.

    
davo36 14.02.2014 00:56
quelle

Tags und Links