Mit der Parallel-Klasse bietet Joblib im Wesentlichen eine bequeme Schnittstelle für das zu Python gehörige Modul
»multiprocessing
«
. Es unterstützt die gleiche Funktionalität, aber die Kombination von Parallel und
»delayed()
«
reduzieren den Implementationsaufwand einfacher Parallelisierungsaufgaben auf eine Zeile. Dazu gibt es Statusausgaben und Konfigurationsmöglichkeiten mit jeweils einem Argument.
Das vorherige Beispiel bediente sich einer kleinen und praktisch sinnlosen Funktion
»f(x)
«
. Ob parallelisiert oder nicht, manche Funktionen erledigen hingegen sehr Zeit- und Ressourcen-aufwendige Berechnungen. Sind die Eingabewerte vor dem Programmstart unbekannt, verarbeitet eine solche Funktion womöglich mehrfach dieselben Argumente; möglicherweise ein unnötiger Aufwand.
Es liegt bei aufwendigeren Funktionen also nahe, deren Ergebnisse abzuspeichern (Memorization). Für den Fall, dass sie mit demselben Argument aufgerufen wird, greift sie so direkt auf das Ergebnis zurück, statt es erneut auszurechnen. Auch hier greift Joblib dem Programmierer mit der Klasse
»Memory
«
unter die Arme.
Sie stellt eine Methode
»cache()
«
bereit, die als Decorator für beliebige Funktionen mit einem oder mehreren Funktionsargumenten dient. Ergebnisse der so dekorierten Funktion speichert das Memory-Objekt dann auf der Festplatte ab; beim nächsten Aufruf prüft sie, ob das gleiche Argument oder die gleichen Argumente bereits verarbeitet wurden und liefert gegebenenfalls direkt das Ergebnis aus (
Abbildung 2
).
Listing 3
zeigt eine Implementation, wieder mit einer primitiven Beispielfunktion
»f(x)
«
.
Listing 3
Funktionsergebnisse speichern
Die berechneten Ergebnisse landen auf der Festplatte im Verzeichnis
»joblib
«
unterhalb des mit dem Parameter
»cachedir
«
definierten Verzeichnisses. Darin erhält jede memorisierte Funktion wieder ein eigenes Unterverzeichnis, das unter anderem in der Datei
»func_code.py
«
den Original-Python-Quellcode der Funktion enthält.