[Python-de] re und findall

Diez B. Roggisch deets at web.de
Mon Feb 28 14:44:46 CET 2005


> Jetzt machst Du mich ein bißchen Neugierig, wo liegt den da mein
> Denkfehler? Im Modul sgmllib werden schließlich auch reguläre Ausdrücke
> verwendet zwar nicht so speziel wie meine, aber trotzdem sind es reguläre
> Ausdrücke!

Reguläre Ausdrücke sind nicht per se böse, und auch nach wie vor ein probates 
Mittel in der Syntaxanalyse. Aber sgm/xml sind sprachen, die über sogenannte 
kontextfreie Grammatiken definiert werden, und nicht über die der wesentlich 
weniger mächtigen der regulären Grammatiken - die ja die Basis der regulären 
Ausdrücke bilden. Es wird daher _immer_ Fälle geben, die sich mit regulären 
Ausdrücken alleine nicht lösen lassen. Dann schreibt man entweder  
"irgendwas" selbst - oder bemüht eben einen der bereits existierenden parser. 

Und da meistens früher oder später bei der Entwicklung die Anforderungen 
steigen _und_ in diesem konkreten Fall die Einfachheit der sgmllib Lösung ja 
wohl kaum zu unterbieten ist (letztlich 3 Zeilen für eine überladenen Klasse, 
und keine Rückfragen hier, weil reguläre Ausdrücke sich nicht so verhalten 
haben, wie du dir das gewünscht hast) sollte man eben einfach das richtige 
Tool für den Job nehmen.

> Warum? Ich wollte zuerst das ganze mit der sgmllib machen, stellte aber bei
> der Umsetzung fest, das der meiste Code der dort ausgeführt wird, nichts
> zur konkreten Lösung meines Problems beiträgt. Außerdem, Deine Lösung
> braucht 11 mal mehr Zeit als meine :-)) gemessen mit den Python profiler
> und meine Lösung kann man sicherlich noch optimieren :-)).

Das ist eben der 2te Denkfehler. Verfrühte Optimierung. Solange die Sache 
einfach und ausreichend schnell läuft, muss man sich da auch keinen Kopp 
machen.  Und _wenn_ die performance kritisch ist, könnte es ebensogut sein 
das eine C-basierte Lösung schneller ist - warum dann überhaupt python? Weil 
die wesentlich wichtigere und teurere Entwicklungszeit kürzer ist!

Abgesehen davon, das ohne Code und Daten deine Aussagen nicht verifizierbar 
sind.  Sicherlich ist der sgmllib-parser per se langsamer (weil deutlich 
mächtiger, und nicht in C geschrieben wie die regexp-libs). Aber hast du zB 
die Parsierung deiner Eingabe zeilenweise vorgenommen und abgebrochen nachdem 
das body-open-tag auftauchte? Damit wäre dann der ganz Rest weggefallen, und 
ich denke das würde einiges an Performance bringen.

Aber wie schon gesagt, die Diskussion ist nicht zielführend - es gibt meistens 
keinen Grund das zu oaptimieren.

> PS. Gemsen wurde die Geschwindigkeit beider Skripte auf einem Celeron 1300
> mit 256 MB Speicher unter Linux.

Das ist völlig irrelevant - du hast ja weder code und Beispieldateien noch 
konkrete Laufzeiten gemeldet - die Ergebnisse wären auf einem c64 relativ 
gesehen auch so ausgefallen. Wenn der denn python laufen liesse...

MfG Diez