Frage

Jedes Mal, wenn eine Python-Datei importiert wird, die eine große Menge statischer regulärer Ausdrücke enthält, CPU-Zyklen, um die Saiten in ihre repräsentativen Zustandsmaschinen im Speicher kompiliert ausgegeben werden.

a = re.compile("a.*b")
b = re.compile("c.*d")
...

Frage: Ist es möglich, diese regulären Ausdrücke in einem Cache auf der Festplatte in einer vorkompilierte Weise zu speichern, um zu vermeiden, die regex Compilations auf jedem Import ausführen

Beiz- das Objekt einfach nicht die folgenden, verursacht Kompilierung passieren sowieso:

>>> import pickle
>>> import re
>>> x = re.compile(".*")
>>> pickle.dumps(x)
"cre\n_compile\np0\n(S'.*'\np1\nI0\ntp2\nRp3\n."

Und re Objekte sind unmarshallable:

>>> import marshal
>>> import re
>>> x = re.compile(".*")
>>> marshal.dumps(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unmarshallable object
War es hilfreich?

Lösung

  

Ist es möglich, diese regulären Ausdrücke in einem Cache auf der Festplatte in einer vorkompilierte Weise zu speichern, um zu vermeiden, die regex Compilations auf jedem Import auszuführen?

Nicht leicht. Sie müßten einen benutzerdefinierten Serializer schreiben, die die C sre Implementierung der Pythons Regex-Engine hakt in. Etwaige Leistungsvorteile würden erheblich aufgewogen durch die Zeit und Aufwand erforderlich ist.

Als erstes haben Sie den Code tatsächlich profiliert? Ich bezweifle, dass reguläre Ausdrücke ist ein wichtiger Teil des Antrags der Laufzeit zu kompilieren. Denken Sie daran, dass sie nur das erste Mal kompiliert das Modul in der aktuellen Ausführung importiert wird -. Danach wird das Modul und seine Attribute werden im Arbeitsspeicher zwischengespeichert

Wenn Sie ein Programm, das im Grunde einmal spawnt, erstellt eine Reihe von regulären Ausdrücken, und tritt dann aus, könnten Sie versuchen, Re-Engineering es mehrere Tests in einem Aufruf durchzuführen. Dann könnten Sie die regulären Ausdrücke wiederverwenden, wie oben.

Schließlich kann man die regulären Ausdrücke in C-basierten Zustandsmaschinen zusammenstellen und sie dann mit einem Erweiterungsmodul verknüpfen in. Während dies wahrscheinlich schwieriger sein würde, zu halten, wäre es völlig aus Ihrer Anwendung regex Kompilation beseitigen.

Andere Tipps

Beachten Sie, dass jedes Modul selbst während der Lebensdauer einer Anwendung nur einmal initialisiert, egal, wie oft Sie es importieren. Also, wenn Sie Ihre Ausdrücke in dem Modul des globalen Bereich kompilieren (dh. Nicht in einer Funktion) Sie sollte in Ordnung sein.

Zunächst einmal ist dies eine klare Begrenzung des Python re-Modul. Es bewirkt, dass eine Grenze, wie viel und wie groß reguläre Ausdrücke angemessen sind. Die Grenze ist größer mit langen laufenden Prozessen und kleiner mit kurzlebigen Prozessen wie Kommandozeilen-Applikationen.

Vor einigen Jahren habe ich es sehe und es ist möglich, das Übersetzungsergebnis zu graben, Beize es und dann unpickle es und es wieder verwenden. Das Problem ist, dass es erfordert, dass die sre.py Einbauten verwendet und so wird nicht wahrscheinlich in verschiedenen Python-Versionen funktionieren.

Ich mag diese Art von Funktion in meinem Werkzeugkasten haben. Ich würde auch gerne wissen, ob es irgendwelche separate Module, die stattdessen verwendet werden könnten.

Der shelve Modul erscheint nur gut zu funktionieren:


import re
import shelve
a_pattern = "a.*b"
b_pattern = "c.*d"
a = re.compile(a_pattern)
b = re.compile(b_pattern)

x = shelve.open('re_cache')
x[a_pattern] = a
x[b_pattern] = b
x.close()

# ...
x = shelve.open('re_cache')
a = x[a_pattern]
b = x[b_pattern]
x.close()

Sie können dann eine nette Wrapper-Klasse machen, die automatisch die Caching für Sie behandeln, so dass sie für den Benutzer transparent werden ... eine Übung des Leser überlassen.

Öffnen /usr/lib/python2.5/re.py und suchen Sie nach "def _compile". Sie werden re.py internen Cache-Mechanismus finden.

Es ist möglich, jede regex (oder eine Gruppe von regexs) in eine separate Datei zu platzieren und dann dynamisch die Datei importieren, die Sie das imp-Modul benötigen verwenden. Ich bezweifle, dass es sehr gut skaliert, aber es könnte sein, was Sie brauchen.

Hum,

Ist ad acta nicht Gebrauch Gurke?

Wie auch immer, ich stimme mit dem vorherigen anwsers. Da ein Modul nur einmal verarbeitet wird, bezweifle ich regexps Kompilieren wird Ihr App Flaschenhals sein. Und Python re Modul böse schnell ist, da es in C codiert ist: -)

Aber die gute Nachricht ist, dass Python eine nette Gemeinschaft habe, so bin ich sicher, dass Sie jemand zur Zeit finden Hacking, was Sie brauchen.

gegoogelt I 5 sec und gefunden: http: //home.gna. org / oomadness / en / cerealizer / index.html .

Sie wissen nicht, ob es es tun, aber wenn nicht, in dir viel Glück Forschung: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top