Skip to content

Einführung in Streamlit und Caching

Streamlit ist eine Open-Source-Python-Bibliothek, mit der Entwickler interaktive, benutzerfreundliche Webanwendungen für Machine Learning- und Data Science-Projekte erstellen können. Es wurde entwickelt, um Data Scientists und Ingenieuren dabei zu helfen, Daten-Scripts mit nur wenigen Codezeilen in gemeinsam nutzbare Web-Apps umzuwandeln, ohne dass Front-End-Entwicklungsfähigkeiten erforderlich sind.

Auf der anderen Seite ist Caching eine Technik in der Informatik, um Daten vorübergehend in einem temporären Speicherbereich, auch als Cache bezeichnet, zu speichern, um die Datenabfrage zu beschleunigen. Im Kontext von Streamlit kann Caching die Leistung Ihrer Webanwendungen signifikant verbessern, insbesondere bei der Arbeit mit großen Datensätzen oder komplexen Berechnungen.

Was ist Streamlit?

Streamlit ist ein Gamechanger im Bereich Data Science und Machine Learning. Damit können Sie interaktive und robuste Data-Apps schnell erstellen. Mit Streamlit können Sie mit nur wenigen Zeilen Python-Code schöne datengesteuerte Webanwendungen erstellen. Es wurde entwickelt, um große Datensätze und komplexe Berechnungen zu handhaben, wodurch es ein leistungsstarkes Werkzeug für Data Scientists und Machine Learning Engineers ist.

Was ist Caching?

Caching ist eine Technik, die verwendet wird, um Daten temporär in einem Cache, einer Hochgeschwindigkeitsspeicherschicht, zu speichern. Der Hauptzweck des Cachings besteht darin, die Geschwindigkeit der Datenabfrage durch Reduzierung der Notwendigkeit des Zugriffs auf die langsameren zugrunde liegenden Speicherschichten zu erhöhen. Wenn die Daten angefordert werden, prüft das System zuerst den Cache. Wenn die Daten gefunden werden, werden sie sofort zurückgegeben. Andernfalls holt das System die Daten aus dem primären Speicher, gibt sie zurück und speichert sie auch im Cache für zukünftige Anfragen.

Warum benötigen Sie Caching in Streamlit?

In Streamlit wird bei jeder Interaktion in der App das gesamte Skript von oben nach unten neu ausgeführt. Obwohl dieses Modell das Programmiermodell vereinfacht, kann es zu Ineffizienzen führen. Wenn Ihr Skript zum Beispiel eine Funktion enthält, die einen großen Datensatz lädt oder eine zeitaufwändige Berechnung durchführt, möchten Sie diese Funktion nicht bei jedem Neuausführen des Skripts ausführen. Hier kommt das Caching ins Spiel. Durch die Verwendung von Streamlits Caching können Sie sicherstellen, dass bestimmte Funktionen nur dann erneut ausgeführt werden, wenn sich ihre Eingaben ändern.

Die Vorteile der Verwendung von Streamlit Caching

Caching in Streamlit bietet mehrere Vorteile:

  • Verbesserte Leistung: Durch das Speichern der Ergebnisse von aufwändigen Funktionsaufrufen im Cache können Sie Ihre Streamlit-Apps erheblich beschleunigen. Dies ist besonders vorteilhaft, wenn Sie mit großen Datensätzen oder komplexen Machine Learning-Modellen arbeiten, die lange Lade- oder Berechnungszeiten benötigen.

  • Erhöhte Effizienz: Caching ermöglicht es Ihnen, unnötige Berechnungen zu vermeiden. Wenn eine Funktion zuvor mit denselben Argumenten aufgerufen wurde, kann Streamlit das Ergebnis aus dem Cache abrufen, anstatt die Funktion erneut auszuführen.

  • Verbesserte Benutzererfahrung: Schnellere Ladezeiten und reaktionsschnellere Apps führen zu einer besseren Benutzererfahrung. Mit Caching müssen Benutzer nicht jedes Mal auf Datenladevorgänge oder Berechnungen warten, wenn sie mit Ihrer App interagieren.

Streamlits Caching-Mechanismus ermöglicht es Entwicklern, die Ergebnisse von Funktionsberechnungen in einem Cache zu speichern, was zu schnellerer Datenabfrage und verbesserte App-Leistung führt. In diesem Abschnitt wird erläutert, wie Streamlit Caching funktioniert, welche Vorteile es hat und welche Herausforderungen es mit sich bringt.

Herausforderungen bei der Verwendung von Streamlit Caching

Obwohl Caching eine leistungsstarke Funktion ist, bringt es auch einige Herausforderungen mit sich:

  • Cache-Verwaltung: Die Verwaltung des Caches kann knifflig sein. Sie müssen sicherstellen, dass der Cache nicht zu viel Speicherplatz beansprucht und dass er korrekt ungültig gemacht wird, wenn sich die Eingaben einer gecachten Funktion ändern.

  • Debugging: Das Debugging kann mit Caching komplexer sein. Wenn der Ausgabewert einer Funktion aus dem Cache gelesen wird, werden keine Print-Anweisungen oder Seiteneffekte in der Funktion ausgeführt, was das Debugging erschweren kann.

  • Cache-Persistenz: Standardmäßig wird der Cache von Streamlit bei jedem Neustart des Streamlit-Servers geleert. Wenn Sie eine persistente Cachefunktion über mehrere Neustarts hinweg benötigen, müssen Sie erweiterte Caching-Optionen oder externe Caching-Lösungen verwenden.

Wie Streamlit Caching funktioniert

Streamlit bietet einen Decorator, @st.cache, den Sie vor einer Funktionsdefinition hinzufügen können, um das Caching zu aktivieren. Wenn Sie eine Funktion mit dem @st.cache Decorator markieren, überprüft Streamlit, ob diese Funktion zuvor mit denselben Eingaben aufgerufen wurde. Wenn dies der Fall ist, liest Streamlit das Ergebnis der Funktion aus dem Cache, was viel schneller ist als die Ausführung der Funktion. Andernfalls führt es die Funktion aus, speichert das Ergebnis im Cache und gibt es zurück.

Hier ist ein einfaches Beispiel, wie Sie Streamlit Caching verwenden können:

@st.cache
def load_data():
    data = pd.read_csv('large_dataset.csv')
    return data

In diesem Beispiel wird die Funktion load_data nur einmal ausgeführt, unabhängig davon, wie oft das Skript erneut ausgeführt wird. Das Ergebnis wird im Cache für zukünftige Verwendungszwecke gespeichert, was Zeit und Rechenressourcen spart.

Streamlit Caching Mechanismen: @st.cache, st.cache_data und st.cache_resource

Streamlit bietet mehrere Caching-Mechanismen, die je nach Ihren Anforderungen verwendet werden können. In diesem Abschnitt wird der Unterschied zwischen @st.cache, st.cache_data und st.cache_resource erläutert.

@st.cache

@st.cache ist ein Decorator, den Sie vor einer Funktionsdefinition hinzufügen können, um das Caching zu aktivieren. Wenn eine Funktion mit @st.cache markiert ist und aufgerufen wird, überprüft Streamlit, ob die Funktion zuvor mit denselben Eingaben aufgerufen wurde. Wenn dies der Fall ist, liest Streamlit das Ergebnis der Funktion aus dem Cache. Andernfalls führt es die Funktion aus, speichert das Ergebnis im Cache und gibt es zurück.

Hier ist ein Beispiel, wie Sie @st.cache verwenden können:

@st.cache
def load_data():
    data = pd.read_csv('large_dataset.csv')
    return data

In diesem Beispiel wird die Funktion load_data nur einmal ausgeführt, unabhängig davon, wie oft das Skript erneut ausgeführt wird. Das Ergebnis wird im Cache für zukünftige Verwendung gespeichert.

st.cache_data

Das st.cache_data ist ein Decorator, der verwendet wird, um Funktionen zu cachieren, die Daten zurückgeben, wie z.B. Dataframe-Transformationen, Datenbankabfragen oder maschinelles Lernen. Die zwischengespeicherten Objekte werden in einer "gepickelten" Form gespeichert, d.h. der Rückgabewert einer gecacheten Funktion muss pickelbar sein. Jeder Aufrufer der gecachten Funktion erhält eine eigene Kopie der gecachten Daten. Sie können den Cache einer Funktion mit func.clear() löschen oder den gesamten Cache mit st.cache_data.clear(). Wenn Sie globale Ressourcen cachen müssen, verwenden Sie stattdessen st.cache_resource.

Die Funktionssignatur sieht wie folgt aus:

st.cache_data(func=None, *, ttl, max_entries, show_spinner, persist, experimental_allow_widgets, hash_funcs=None)

Die Parameter umfassen die zu cachende Funktion, die maximale Zeit, die ein Eintrag im Cache gehalten werden soll, die maximale Anzahl an Einträgen, die im Cache gehalten werden sollen, ob der Spinner aktiviert werden soll, der Speicherort, an dem die gecachten Daten gespeichert werden sollen, ob Widgets in der gecachten Funktion verwendet werden dürfen, und eine Zuordnung von Typen oder vollständigen Namen zu Hash-Funktionen.

st.cache_resource

Das st.cache_resource ist ein Decorator, der verwendet wird, um Funktionen zu cachieren, die globale Ressourcen zurückgeben, wie z.B. Datenbankverbindungen oder maschinelles Lernen. Die zwischengespeicherten Objekte werden von allen Benutzern, Sitzungen und erneuten Ausführungen gemeinsam genutzt. Sie müssen thread-sicher sein, da sie von mehreren Threads gleichzeitig aufgerufen werden können. Wenn die Thread-Sicherheit ein Problem ist, können Sie stattdessen st.session_state verwenden, um Ressourcen pro Sitzung zu speichern. Sie können den Cache einer Funktion mit func.clear() löschen oder den gesamten Cache mit st.cache_resource.clear().

Die Funktionssignatur sieht wie folgt aus:

st.cache_resource(func, *, ttl, max_entries, show_spinner, validate, experimental_allow_widgets, hash_funcs=None)

Die Parameter umfassen die Funktion, die die zwischengespeicherte Ressource erstellt, die maximale Zeit, die ein Eintrag im Cache gehalten werden soll, die maximale Anzahl an Einträgen, die im Cache gehalten werden sollen, ob der Spinner aktiviert werden soll, eine optionale Validierungsfunktion für zwischengespeicherte Daten, ob Widgets in der zwischengespeicherten Funktion verwendet werden dürfen, und eine Zuordnung von Typen oder vollständigen Namen zu Hash-Funktionen.

Streamlit-Caching in der Praxis: Anwendungsfälle und Beispiele

Streamlit-Caching kann in verschiedenen Szenarien eingesetzt werden, um die Leistung Ihrer Datenanwendungen zu verbessern. In diesem Abschnitt werden einige gängige Anwendungsfälle untersucht und Beispiele dafür gegeben, wie das Caching in Streamlit implementiert werden kann.

Caching von maschinellen Lernmodellen

Das Laden von maschinellen Lernmodellen kann zeitaufwändig sein, insbesondere bei großen Modellen. Durch das Cachen des Modell-Ladevorgangs können Sie die Geschwindigkeit Ihrer Streamlit-Apps erheblich verbessern. Hier ist ein Beispiel:

@st.cache(allow_output_mutation=True)
def load_model():
    model = load_your_model_here()  # mit Ihrem Ladecode für das Modell ersetzen
    return model

In diesem Beispiel wird die Option allow_output_mutation=True verwendet, da maschinelle Lernmodelle oft nicht-hashbare Typen enthalten, die nicht mit Streamlits Standard-Caching kompatibel sind.

Caching von Datenvisualisierungen

Die Visualisierung von Daten kann ein rechenintensiver Prozess sein, insbesondere bei großen Datensätzen. Durch das Zwischenspeichern der Ergebnisse Ihrer Datenvisualisierungsfunktionen können Sie Ihre Streamlit-Apps responsiver machen. Hier ist ein Beispiel:

@st.cache
def create_plot(data):
    fig = perform_expensive_plotting_here(data)  # mit Ihrem Code für die Visualisierung ersetzen
    return fig

In diesem Beispiel wird die Funktion create_plot nur erneut ausgeführt, wenn sich die Eingabe data ändert, was Zeit und Rechenressourcen spart.

Caching von API-Aufrufen

Wenn Ihre Streamlit-App API-Aufrufe macht, kann das Caching Ihnen helfen, API-Rate-Limits zu vermeiden und die Leistung Ihrer App zu verbessern, indem die Anzahl der API-Aufrufe reduziert wird. Hier ist ein Beispiel:

@st.cache
def fetch_data(api_url):
    response = requests.get(api_url)
    return response.json()

In diesem Beispiel wird die Funktion fetch_data nur einen API-Aufruf machen, wenn sie mit einer neuen api_url aufgerufen wird. Andernfalls wird die zwischengespeicherte Antwort zurückgegeben.

Caching von Web-Scraping-Ergebnissen

Web-Scraping kann ein zeitaufwändiger Prozess sein, und das wiederholte Scrapen derselben Website kann dazu führen, dass Ihre IP-Adresse blockiert wird. Durch das Cachen der Ergebnisse Ihrer Web-Scraping-Funktionen können Sie unnötige Netzwerkanfragen vermeiden. Hier ist ein Beispiel:

@st.cache
def scrape_website(url):
    data = perform_web_scraping_here(url)  # mit Ihrem Web-Scraping-Code ersetzen
    return data

In diesem Beispiel wird die Funktion scrape_website nur die Website scrapen, wenn sie mit einer neuen url aufgerufen wird. Andernfalls wird die zwischengespeicherte Daten zurückgegeben.

Best Practices für Streamlit-Caching

Beim Verwenden von Streamlit-Caching gibt es einige bewährte Praktiken, die zu beachten sind:

  • Verwenden Sie @st.cache sparsam: Obwohl das Caching die Leistung Ihrer App erheblich verbessern kann, kann es auch viel Speicherplatz verbrauchen, wenn es nicht sorgfältig verwendet wird. Verwenden Sie @st.cache nur für Funktionen, die aufwändige Berechnungen durchführen oder große Datensätze laden.

  • Vermeiden Sie Seiteneffekte in gecachten Funktionen: Funktionen, die mit @st.cache markiert sind, sollten keine Seiteneffekte haben. Seiteneffekte sind Änderungen, die eine Funktion an ihrer Umgebung vornimmt, z.B. das Ändern einer globalen Variable oder das Schreiben in eine Datei. Wenn eine Funktion mit Seiteneffekten gecacht wird, treten die Seiteneffekte nur beim ersten Aufruf der Funktion auf.

  • Achten Sie auf mutable Argumente: Wenn eine gecachte Funktion mutable Argumente, wie Listen oder Dictionaries, enthält, beachten Sie, dass Streamlit die Anfangswerte dieser Argumente verwendet, um das zwischengespeicherte Ergebnis zu identifizieren. Wenn Sie die Argumente nach dem Aufruf der Funktion ändern, erkennt Streamlit die Änderungen nicht und liefert das zwischengespeicherte Ergebnis zurück.

  • In Betracht ziehen, allow_output_mutation=True für nicht-hashbare Ausgaben zu verwenden: Standardmäßig erfordert der Cache von Streamlit, dass die Ausgaben von Funktionen hashbar sind. Wenn Ihre Funktion eine nicht-hashbare Ausgabe wie ein maschinelles Lernmodell zurückgibt, können Sie die Option allow_output_mutation=True verwenden, um diese Anforderung zu umgehen.

Bonus: Streamlits interaktive Widgets

Streamlits interaktive Widgets sind eine Schlüsselfunktion, die es von anderen Data-Visualisierungswerkzeugen unterscheidet. Diese Widgets ermöglichen es Benutzern, mit Ihren Streamlit-Apps zu interagieren. Dadurch können sie das Verhalten Ihrer App steuern und in Echtzeit mit Ihren Daten interagieren.

Schieberegler

Der Schieberegler-Widget ermöglicht es Benutzern, einen Wert oder einen Wertebereich auszuwählen, indem sie einen Griff entlang einer horizontalen Skala verschieben. Dies ist nützlich, um Benutzern die Kontrolle über numerische Parameter in Ihrer App zu ermöglichen.

age = st.slider('Wie alt bist du?', 0, 130, 25)
st.write("Ich bin ", age, 'Jahre alt')

In diesem Beispiel können Benutzer mit dem Schieberegler ein Alter zwischen 0 und 130 auswählen. Der Standardwert ist auf 25 eingestellt.

Kontrollkästchen

Das Kontrollkästchen-Widget ermöglicht es Benutzern, eine binäre Option ein- oder auszuschalten. Dies ist nützlich, um Benutzern das Aktivieren oder Deaktivieren bestimmter Funktionen in Ihrer App zu ermöglichen.

agree = st.checkbox('Ich stimme zu')
if agree:
    st.write('Großartig!')

In diesem Beispiel können Benutzer einer Aussage zustimmen oder nicht zustimmen. Wenn der Benutzer das Kontrollkästchen aktiviert, wird die Nachricht "Großartig!" angezeigt.

Texteingabe

Das Texteingabe-Widget ermöglicht es Benutzern, einen Text einzugeben. Dies ist nützlich, um Benutzern das Eingeben von Textdaten in Ihre App zu ermöglichen.

title = st.text_input('Filmtitel', 'Das Leben des Brian')
st.write('Der aktuelle Filmtitel ist', title)

In diesem Beispiel können Benutzer einen Filmtitel eingeben.

Kennen Sie dieses tolle Datenanalyse- und Datenvisualisierungstool, das Ihre Streamlit-App in Tableau verwandelt?

PyGWalker (opens in a new tab) ist eine Python-Bibliothek, die es Ihnen ermöglicht, eine Tableau-ähnliche Benutzeroberfläche mühelos in Ihre eigene Streamlit-App einzubetten. Schauen Sie sich dieses erstaunliche Video an, das von Wie man Daten mit PyGWalker in Python erkundet (opens in a new tab) erstellt wurde und die detaillierten Schritte zur Stärkung Ihrer Streamlit-App mit dieser leistungsstarken Data Visualization Python Library zeigt!


Besonderer Dank an Sven und seinen großartigen Beitrag (opens in a new tab) zur PyGWalker-Community!

Darüber hinaus können Sie auch die PyGWalker GitHub-Seite (opens in a new tab) für weitere PyGWalker-Beispiele besuchen.

Fazit

Streamlits Caching-Mechanismus ist ein leistungsstolles Werkzeug, das die Geschwindigkeit Ihrer App erheblich steigern kann, indem unnötige Berechnungen vermieden werden. Indem Sie verstehen, wie Streamlits Caching funktioniert und wie Sie es effektiv nutzen können, können Sie effizientere und reaktionsschnellere Apps erstellen. Egal ob Sie Datenveränderungen, maschinelles Lernen oder API-Aufrufe cachen, Streamlits Caching kann Ihnen helfen, ein flüssigeres und interaktiveres Benutzererlebnis zu bieten.

Denken Sie daran, dass das Caching die Leistung verbessern kann, nicht immer jedoch die richtige Lösung ist. Beachten Sie stets die Kompromisse und stellen Sie sicher, dass Sie Ihre App gründlich testen, um sicherzustellen, dass das Caching die Leistung Ihrer App verbessert, ohne unerwartetes Verhalten einzuführen.

Streamlits interaktive Widgets wie Schieberegler, Kontrollkästchen und Texteingaben bieten eine Möglichkeit für Benutzer, mit Ihrer App zu interagieren und deren Verhalten zu steuern. Durch die Kombination dieser Widgets mit Streamlits Caching-Mechanismus können Sie leistungsstarke und reaktionsschnelle Datenanwendungen erstellen.

Letztendlich machen Streamlits Einfachheit, Flexibilität und Fokussierung auf Daten und maschinelles Lernen es zu einer großartigen Wahl für den Aufbau von Datenanwendungen. Mit seinem Caching-Mechanismus und interaktiven Widgets können Sie Apps erstellen, die nicht nur leistungsstark und effizient sind, sondern auch interaktiv und ansprechend.

Kennen Sie dieses tolle Datenanalyse- und Datenvisualisierungstool, das Ihre Streamlit-App in Tableau verwandelt?

PyGWalker (opens in a new tab) ist eine Python-Bibliothek, die es Ihnen ermöglicht, eine Tableau-ähnliche Benutzeroberfläche mühelos in Ihre eigene Streamlit-App einzubetten.

PyGWalker für Datenvisualisierung in Streamlit (opens in a new tab)

Häufig gestellte Fragen

Wie funktioniert das Streamlit-Caching?

Der Caching-Mechanismus von Streamlit funktioniert, indem die Ergebnisse von Funktionsaufrufen in einem Cache gespeichert werden. Wenn eine mit @st.cache dekorierte Funktion aufgerufen wird, prüft Streamlit, ob die Funktion bereits mit den gleichen Eingaben aufgerufen wurde. Wenn dies der Fall ist, kann Streamlit den Funktionsaufruf überspringen und stattdessen das zwischengespeicherte Ergebnis verwenden. Dadurch kann die Leistung Ihrer App erheblich gesteigert werden, indem teure Berechnungen wie das Laden von Daten oder das Ausführen eines maschinellen Lernmodells vermieden werden.

Welche Einschränkungen gibt es beim Streamlit-Cache?

Obwohl der Caching-Mechanismus von Streamlit leistungsstark ist, hat er einige Einschränkungen. Zum Beispiel muss der Rückgabewert einer gecachten Funktion picklebar sein, d.h. er kann mit dem Python-Modul pickle serialisiert und deserialisiert werden. Das bedeutet, dass nicht alle Python-Objekte von einer gecachten Funktion zurückgegeben werden können. Darüber hinaus sollten gecachte Funktionen keine Nebeneffekte haben, da diese nur beim ersten Aufruf der Funktion ausgeführt werden.

Wie löscht man den Cache in Streamlit?

Sie können den Cache in Streamlit mit der Funktion st.cache.clear() löschen. Dadurch werden alle Einträge aus dem Cache entfernt. Wenn Sie den Cache für eine bestimmte Funktion löschen möchten, können Sie die Methode func.clear() verwenden, wobei func die gecachte Funktion ist.

Wo befindet sich der Streamlit-Cache? Streamlit's Cache wird standardmäßig im Arbeitsspeicher gespeichert. Das bedeutet, dass der Cache jedes Mal gelöscht wird, wenn Ihre Streamlit-App neu gestartet wird. Sie können jedoch Streamlit so konfigurieren, dass der Cache auf der Festplatte persistiert wird, indem Sie den persist-Parameter des @st.cache-Dekorators auf True setzen.