Seite 1 von 1

LRU Cache

Verfasst: Sonntag 11. März 2007, 22:37
von mitsuhiko
Ein Teil meines Wochendes ist draufgegangen als ich versucht habe einen LRU Cache für Jinja zu schreiben. Lustigerweise hab ich im Gegensatz zu dem Snippet im ActiveState Kochbuch und den Versuch von Genshi und Mako keine Linked-Lists, sondern eine stinknormale Liste verwendet. Und für meine Anwendungsfälle scheint das sogar schneller zu sein.

Wer sowas also braucht: http://paste.pocoo.org/show/1174/

Verfasst: Montag 12. März 2007, 09:36
von rayo
Hi

Warum nimmst du bei get und setdefault nicht try: except? Vorallem bei get ist es ja der normalfall, dass der Key vorhanden ist.

Code: Alles auswählen

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def setdefault(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            self[key] = default
            return default
Und funktioniert clear? Ich hab mal schnell bei deque del self._queue[:] versucht, und da gibts bei mir einen TypeError: sequence index must be integer, bei der deque gibts dafür .clear()

Lösen könnte man es so:

Code: Alles auswählen

    def clear(self):
        self._mapping.clear()
        try:
            del self._queue[:]
        except TypeError:
            self._queue.clear()
Gruss

Verfasst: Montag 12. März 2007, 10:31
von mitsuhiko
rayo hat geschrieben:Warum nimmst du bei get und setdefault nicht try: except? Vorallem bei get ist es ja der normalfall, dass der Key vorhanden ist.
Weil der "in" Check schneller ist als ein try/except
Und funktioniert clear? Ich hab mal schnell bei deque del self._queue[:] versucht, und da gibts bei mir einen TypeError: sequence index must be integer, bei der deque gibts dafür .clear()
Joa. Ist ein Bug. Werd ich beheben.

Verfasst: Dienstag 13. März 2007, 18:50
von EnTeQuAk
Darf man mal genauer Fragen, wofür du das genau einsetzt?

Ich bastel auch schon ne Weile an nem geeignetem Token-Cache-System, für meinen SyntaxParser
um ihm damit ein paar neue Funktionen zu geben... und mit ihm einen kleinen miniAST zu generieren. Aber dein LRU-Cache scheint dafür nicht ganz geeignet oder sehe ich das falsch?