memoize auf der Festplatte - python - persistent memoization
Ist es ein Weg, um memoize die Ausgabe einer Funktion auf die Festplatte?
Habe ich eine Funktion
def getHtmlOfUrl(url):
... # expensive computation
und würde gerne etwas machen wie:
def getHtmlMemoized(url) = memoizeToFile(getHtmlOfUrl, "file.dat")
dann rufen Sie getHtmlMemoized(url), um so zu tun, teuer Berechnung nur einmal für jede url.
- Nur Gurke (oder json verwenden) den cache dict.
- vielen Dank, aber ich bin ein python Neuling (zweiten Tag). Ich habe nicht die geringste Ahnung, was du meinst...
- Fein, also, was Sie tun, wie ein Neuling ist nach "python-pickle" in Google, und kommen zurück zu uns, wenn Sie weitere Fragen.
- Anstatt zu versuchen, neu zu erfinden das Rad, hier ist eine Bibliothek, die das tut Recht gut und ist robust gegen alle Arten von Ecke zu Fällen, die Sie nicht erwarten, bis viel später (Parallelität, disk usage, thundering Herd): bitbucket.org/zzzeek/dogpile.cache
- Sie können die Bibliothek verwenden redis-simple-cache, die tut genau das, anhaltende memoisation von Funktionsaufrufen. Überprüfen Sie es heraus : github.com/vivekn/redis-simple-cache
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python bietet eine sehr elegante Möglichkeit, dies zu tun - Dekorateure. Im Grunde, ein decorator ist eine Funktion, die wraps eine weitere Funktion, um zusätzliche Funktionen bereitzustellen, ohne änderung der Funktion source-code. Der Dekorator kann wie folgt geschrieben werden:
Sobald Sie haben, dass "verzieren" die Funktion mit der @-syntax, und Sie sind bereit.
Beachten Sie, dass dieser decorator ist bewusst vereinfacht und funktioniert möglicherweise nicht für jede situation, zum Beispiel, wenn die Quell-Funktion akzeptiert oder gibt Daten zurück, die nicht json-serialisiert.
Mehr über Dekoratoren: Wie eine Kette von Funktion Dekoratoren?
Und hier ist, wie man das decorator speichern des cache nur einmal, bei der Ausfahrt Zeit:
a()
undb()
sind beide memoized, unda()
Anrufeb()
, den cache gelesen werden können, füra()
, und dann wieder fürb()
zuerst b ' s Ergebnis ist memoized, aber dann wird der veraltete cache-aus dem Aufruf eines überschreibt, b-Beitrag der cache verloren.atexit
wäre vielleicht ein besserer Ort für das Spülen der cache. Auf der anderen Seite, indem die vorzeitige Optimierungen könnte die Niederlage der pädagogische Zweck dieser code.Check-out
joblib.Speicher
. Es ist eine Bibliothek für die macht genau das.Eine saubere Lösung powered by Python ' s Regal-Modul. Der Vorteil ist der cache wird aktualisiert in Echtzeit über bekannte
dict
syntax, auch ist es die Ausnahme Beweis(keine Notwendigkeit, Sie zu behandeln ärgerlichKeyError
).Dies erleichtert die Funktion berechnet werden, nur einmal. Neben nachfolgende Aufrufe wird wieder das gespeicherte Ergebnis.
Den Artemis-Bibliothek hat ein Modul für diese. (Sie müssen
pip install artemis-ml
)Sie dekorieren Ihre Funktion:
Intern, es macht einen hash aus der Eingabe-Argumente und speichert die memo-Dateien, die von diesem hash.
Etwas soll dies gerne tun:
Grundlegende Verwendung:
Wenn Sie wollen, schreiben Sie Ihre "cache" zu einer Datei, nachdem Sie es mit -- geladen werden, wieder in die Zukunft:
Unter der Annahme, dass Sie Daten json serialisierbar, sollte dieser code funktionieren
schmücken
getHtmlOfUrl
und dann nennen Sie es einfach, wenn er es hätte laufen vorher, erhalten Sie Ihre zwischengespeicherten Daten.Geprüft mit python 2.x und python 3.x
Gibt es auch
diskcache
.Können Sie die cache_to_disk Paket:
Dieser speichert die Ergebnisse für die 3 Tage, die speziell für die Argumente a, b, c und d.... Die Ergebnisse werden in einer pickle-Datei auf Ihrem Computer, und unpickled und zurückgegeben, das nächste mal die Funktion aufgerufen wird. Nach 3 Tagen, die pickle-Datei ist gelöscht, bis die Funktion erneut auszuführen. Die Funktion wird erneut ausgeführt, wenn die Funktion aufgerufen wird, mit neuen Argumenten. Mehr info hier: https://github.com/sarenehan/cache_to_disk