Forums Neueste Beiträge
 

Python 3.2: Performance von re.finditer

05/05/2011 - 17:47 von janedenone | Report spam
Hallo,

ich nutze folgendes Pattern in einem Skript (Python 3.2) –

pattern = re.compile('<t(?:d|h).*?><a href="(\d+)/(.+?)".*?></a></
t(?:d|h)>\s*<t(?:d|h).*?>(.+?):\s*(.+?)</t(?:d|h)>')

– und die Suche –

for match in pattern.finditer(content):

– in einem Text von ca. 215.000 Zeichen dauert sehr, sehr lange. Wenn
ich das Pattern bis zum ersten Whitespace-Subpattern (\s*) verkürze,
làuft das Skript praktisch sofort durch. Ist das Pattern tatsàchlich
zu komplex, liegt es am Whitespace-Subpattern und wenn ja – wie kann
ich das gewünschte Pattern schneller finden?

Danke und viele Grüße
Jan
 

Lesen sie die antworten

#1 k
05/05/2011 - 21:13 | Warnen spam
janedenone writes:

Hallo,

ich nutze folgendes Pattern in einem Skript (Python 3.2) –

pattern = re.compile('<t(?:d|h).*?><a href="(\d+)/(.+?)".*?></a></
t(?:d|h)>\s*<t(?:d|h).*?>(.+?):\s*(.+?)</t(?:d|h)>')

– und die Suche –

for match in pattern.finditer(content):

– in einem Text von ca. 215.000 Zeichen dauert sehr, sehr lange. Wenn



215000 Zeichen ist nicht sehr groß.
Du hast sehr viele non-greedy Ausdrücke; diese sind wahrscheinlich für
die Laufzeit verantwortlich. Das könnte man sicherlich noch optimieren.
Auch ist wohl nicht an jeder Stelle .* notwendig; die Zeichenklasse
ließe sich bestimmt eingrenzen. Dann fehlt da bestimmt ein re.DOTALL,
denn es können bestimmt Zeilenumbrüche vorkommen.
Aber:
Obiges sieht aus, als wolltest du HTML mit einem regulàren Ausdruck
parsen; dies geht nur selten gut (sofern du Kontrolle über die HTML
Daten hast, diese nur eingeschrànkt geschachtelt und wohlgeformt sind,
kann es gehen). Ansonsten kommt man mit regulàren Ausdrücken schon
ziemlich weit, aber dann sieht es nicht mehr so einfach wie oben aus.

ich das Pattern bis zum ersten Whitespace-Subpattern (\s*) verkürze,
làuft das Skript praktisch sofort durch. Ist das Pattern tatsàchlich
zu komplex, liegt es am Whitespace-Subpattern und wenn ja – wie kann
ich das gewünschte Pattern schneller finden?



Nutze eine HTML Parser.

KP

Ähnliche fragen