SimpleWikiParser

Code-Stücke können hier veröffentlicht werden.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 12. Februar 2007, 12:10

sape hat geschrieben:Jens warum?
Hm. Neben dem einsparen des String-Formatings, wäre es auch flexibler. Man könnte die Klasse dann dem Parser übergeben um eine andere Syntax zu nutzten.
OK, jetzt geht's über erben und "überschreiben" der Methoden. Aber was ist, wenn ich eine Methode überhaupt nicht haben will?

Ist es nicht durch eine seperaren Klasse sauberer getrennt: Programmlogik <-> Syntax ???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Montag 12. Februar 2007, 12:15

Hi

Also ich würde das Dict bevorzugen, nur schon aus dem Grund, weil falls mal ein Token ein Sonderzeichen beinhaltet wird dies mit Funktionen nicht funktionieren. Mit einem String als Key würde dies Funktionieren.

Wegen dem Laufzeitverhalten:
Das interessiert mich überhaupt nicht oder ist der Lexer schon jetzt zu langsam? Optimierung immer erst ganz am Schluss wenn es wirklich zu langsam ist.

Immer zuerst das schönere und flexiblere Programmieren.

Gruss
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:23

BlackJack hat geschrieben: Nein sie verbessert sich, weil man nicht jedesmal `type` als Schlüssel formatieren muss. Das sollte mehr Laufzeit und Speicher verbrauchen, als ein einfacher Test auf `None`. Ob das die Laufzeit nun *spürbar* verbessert, keine Ahnung.
Du meinst das hier?: ``_replace_' + type_'``

Ok, wenn alle Iterationen in dem das hier...

Code: Alles auswählen

method = getattr(self, '_replace_' + type_)
...benutzt wird, immer mehr Zeit kostet als das hier...

Code: Alles auswählen

method = self.cache.get(type_)
if method is None:
..dann ok.

Wenn ich dich also richtig versteh stützt dich deine Argumentation darauf das ``_replace_' + type_'`` mehr Zeit kosten würde als obiges, weil eine Konkatenation mehr Zeit beansprucht als ein simples überprüfen auf None. -- Das klingt selbst für **mich** (Und du weißt wie ich drauf bin ^^) nach ziemlich extreme Optimierung an einer stelle wo das unangebracht ist, da keine Verbesserung im Laufzeitverhalten zu erwarten ist.

lg
BlackJack

Montag 12. Februar 2007, 12:23

jens hat geschrieben:Wie wäre es, wenn man generell eine separate Klasse mit den replacer-Methoden nimmt.
Dann brauchen die auch nicht mehr alle "_%s_replacer" heißen. Man spart sich dadurch die String Formatierung.
Das praktische an dem Entwurfsmuster ist, dass man einfach eine Unterklasse um weitere "replacer" erweitern kann, ohne den Rest anfassen zu müssen. Man könnte auch eine Basisklasse schreiben, die ausschliesslich den Dispatch-Mechanismus enthält und verschiedene Unterklassen für verschiedene Auszeichnungssprachen schreiben. Oder für verschiedene Ausgabesprachen, zum Beispiel RTF oder so.

Ausserdem kann man wirklich alles als Typnamen verwenden, inklusive Schlüsselworte von Python.

Eine weitere Methode es zu beschleunigen ohne eine weitere Klasse einzuführen, wäre vielleicht den Cache in der `__init__()` zu füllen. Einfach alle Attribute von `self` nach dem Muster `_replace_*` absuchen und den Cache entsprechend füllen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:26

BlackJack hat geschrieben:[...]
Eine weitere Methode es zu beschleunigen ohne eine weitere Klasse einzuführen, wäre vielleicht den Cache in der `__init__()` zu füllen. Einfach alle Attribute von `self` nach dem Muster `_replace_*` absuchen und den Cache entsprechend füllen.
Joa, sauber! :) So einfach das wir eigentlich auch drauf hätten kommen müssen!
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Montag 12. Februar 2007, 12:32

Oha... gut nehmen wir den Kampf gegen die Millisekunden an :D

Nein mal Ehrlich... das mit dem Cachen ist ne schöne Idee... bringt viellecht auch Geschwindigkeitsvorteile... aber nur sehr gering.

Ich baue grad alles ein wenig um.. -- und bastel den Vorschlag der extra-erweiterungsklassen ein. Mal auf die Performance gesc*****... :) Das kommt rein, und lässt das ganze wesentlich variabler wirken.

vorher muss aber noch ein anderer Bereich an dauCMS umgeschrieben werden ;) Dann is der SyntaxParser dran :D


MfG EnTeQuAk
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:33

EDIT:
BlackJack hat geschrieben:[...]
Eine weitere Methode es zu beschleunigen ohne eine weitere Klasse einzuführen, wäre vielleicht den Cache in der `__init__()` zu füllen. Einfach alle Attribute von `self` nach dem Muster `_replace_*` absuchen und den Cache entsprechend füllen.
Hier mal ein Versuch. Hoffe das passt so.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from inspect import getmembers

class Foo(object):
    def __init__(self):
        self.cache = dict()
        for elem in getmembers(self):
            if elem[0].endswith('_replace_'):
                self.cache[elem[0].replace('_replace_', '')] = elem[1]
        
    def bold_replace_(self):
        pass
    
    def italic_replace_(self):
        pass



foo = Foo()
#Testausgabe:
for k, v in foo.cache.iteritems():
    print k, v

#Output:
# italic <bound method Foo.italic_replace_ of <__main__.Foo object at 0x009E7690>>
# bold <bound method Foo.bold_replace_ of <__main__.Foo object at 0x009E7690>>

EDIT: Grund, siehe unten.
Zuletzt geändert von sape am Montag 12. Februar 2007, 12:41, insgesamt 1-mal geändert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 12. Februar 2007, 12:37

Du solltest das "_replace_" in den dict-keys gleich weglassen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:40

birkenfeld hat geschrieben:Du solltest das "_replace_" in den dict-keys gleich weglassen.
Jepp, habe ich übersehen.

Zeile 10:

Code: Alles auswählen

self.cache[elem[0].replace('_replace_', '')] = elem[1]
Aber ansonsten passt das so oder gibt es eine schnellere Möglichkeit?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 12. Februar 2007, 12:42

Um "schneller" geht es nicht unbedingt, aber wenn du eh schon weißt, dass der Name auf "_replace_" endet, warum nicht elem[0][:-9]?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:44

birkenfeld hat geschrieben:Um "schneller" geht es nicht unbedingt, aber wenn du eh schon weißt, dass der Name auf "_replace_" endet, warum nicht elem[0][:-9]?
Weil ich das andre Pythonischer finde. Hast aber eigentlich Recht.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Montag 12. Februar 2007, 12:45

sape hat geschrieben:
birkenfeld hat geschrieben:Um "schneller" geht es nicht unbedingt, aber wenn du eh schon weißt, dass der Name auf "_replace_" endet, warum nicht elem[0][:-9]?
Weil ich das andre Pythonischer finde.
Das musst du mir aber jetzt erklären.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 12. Februar 2007, 12:51

Also ich würde auch nicht die Zahl hardcoden, sondern ehr ein len(PREFIX) nehmen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Montag 12. Februar 2007, 12:52

birkenfeld hat geschrieben:
sape hat geschrieben:
birkenfeld hat geschrieben:Um "schneller" geht es nicht unbedingt, aber wenn du eh schon weißt, dass der Name auf "_replace_" endet, warum nicht elem[0][:-9]?
Weil ich das andre Pythonischer finde.
Das musst du mir aber jetzt erklären.
Ich finde es einfach leserlicher und verständlicher als mit zu vielen Indexzugriffen zu arbeiten und vermeide es an jeder stelle wo es geht, wie z.B. oben. Bei recht Komplexen ausdrücken wird das sehr schnell unleserlich. Das ist aber reine Geschmacksache.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Montag 12. Februar 2007, 12:59

sape hat geschrieben:
birkenfeld hat geschrieben:
sape hat geschrieben:
birkenfeld hat geschrieben:Um "schneller" geht es nicht unbedingt, aber wenn du eh schon weißt, dass der Name auf "_replace_" endet, warum nicht elem[0][:-9]?
Weil ich das andre Pythonischer finde.
Das musst du mir aber jetzt erklären.
Ich finde es einfach leserlicher und verständlicher als mit zu vielen Indexzugriffen zu arbeiten und vermeide es an jeder stelle wo es geht, wie z.B. oben. Bei recht Komplexen ausdrücken wird das sehr schnell unleserlich. Das ist aber reine Geschmacksache.
wobei es dann nicht mit Pythonischer zu tun hat. :wink:
Antworten