Kapitel 25
Testen und Tuning
710
Innerhalb dieser Methode wird drei Mal einem Tupel ein Item entnommen (siehe Zeile #6).
Das ist ein Schwachpunkt des Programms, den man leicht beseitigen kann. Wir tunen das
Programm und ersetzen die alte Definition der Methode
__brightness() durch folgenden
Programmtext:
Nach diesem kleinen Eingriff läuft das Programm etwas schneller.
Die Ausführung der
__brightness()-Aufrufe erfordert nun nur noch ca. 0.7 Sekunden. In
diesem Beispiel konnten wir mit wenig Aufwand die Laufzeit verbessern. Das ist die Idee
des Tunings: Kleine lokale Schwachstellen finden und beseitigen.
Es kann aber auch sein, dass eine Performanceverbesserung nur durch eine umfangreiche
Umstrukturierung des Systems (also mit hohen Entwicklungskosten) zu erreichen ist. In
unserem Beispielskript ist der Mechanismus zum Aufbau einer Liste von Sternen in der
Methode
__integrate() (ab Zeile #2) ausgesprochen ungeschickt. Für jeden Lichtpunkt
wird die gesamte Liste der bisher erkannten Sterne durchsucht. Das muss nicht sein. Mit
einem so genannten Scanline-Verfahren könnte man dieses Teilproblem erheblich schneller
lösen. Dafür braucht man aber andere Klassen zur Repräsentation der Sterne. Aus Platzgrün-
den kann ich nicht näher darauf eingehen. Auf der anderen Seite zeigt die Performance-Ana-
lyse, dass sich der Aufwand für ein teures Refactoring (Überarbeitung) in diesem Fall kaum
lohnen würde. Denn für die Bearbeitung der
162 Lichtpunkte wurden gerade einmal 15 Mil-
lisekunden benötigt. Erst bei Bildern mit sehr vielen Sternen fällt der Zeitaufwand für den
Aufbau der Sternenliste ins Gewicht. In Kapitel 30 lernen Sie Funktionen zur Verarbeitung
von Arrays aus dem Modul NumPy kennen, die Sie auch zur effizienten Verarbeitung von
Bildern verwenden können.
25.7 Aufgaben
Aufgabe 1
Schreiben Sie eine Funktion, die aus einem Text die Menge aller Wörter mit n Buchstaben
ermittelt und zurückgibt. Im Docstring soll an einem Beispiel die Korrektheit geprüft
werden.
Funktionskopf:
Beispiel:
def __brightness (self, pixel):
a, b, c = pixel
return a + b + c
def sucheWoerter (text, n):
>>> text = "Habe nun, ach! Philosophie,\
Juristerei und Medizin und leider auch Theologie\
durchaus studiert, mit heißem Bemühn."
711
25.7
Aufgaben
Aufgabe 2
Schreiben Sie ein Testarrangement, das die sort()-Methode von Listen prüft. Folgende
Merkmale einer aufsteigend sortierten Liste sollen getestet werden:
Die sortierte Liste ist genauso lang wie die ursprüngliche (unsortierte) Liste.
Am Anfang der sortierten Liste steht das kleinste Element.
In der aufsteigend sortierten Liste ist niemals der linke Nachbar eines Elementes größer.
Aufgabe 3
a) Erweitern Sie das Programm Starwatch aus Abschnitt 25.6 um das folgende Feature:
Auf dem Sternenbild kann man durch Anklicken einen Stern markieren. An der angeklick-
ten Stelle erscheint ein kleiner gelber Kreis. Außerdem wird in einem zusätzlichen Feld die
Helligkeit des ausgewählten Sterns als Anzahl der Lichtpunkte auf dem Foto angezeigt.
Abbildung 25.6 zeigt einen Screenshot des Anwendungsfensters.
Abb. 25.6: Benutzungsoberfläche des erweiterten Programms starwatch_a.pyw. Es wird die
Helligkeit (Anzahl der Lichtpunkte) des markierten Sterns angegeben.
Hinweise zur Implementierung:
Abbildung 25.7 zeigt die erweiterte Klassenstruktur des Sternmodells. Die Klasse
Star wird
um zwei öffentliche Methoden erweitert, die Folgendes leisten:
Ein Methodenaufruf star.contains (dot) liefert den Wert True, wenn das Star-
Objekt
star den als Argument übergebenen Lichtpunkt enthält.
Der Aufruf star.brightness() liefert die Anzahl der Lichtpunkte des Sterns star.
>>> sucheWoerter (text, 4)
{"Habe", "auch"}

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.