703
25.6
Tuning
mert. So beträgt die Gesamtzeit zur Ausführung der Funktion sort() 0,130 Sekunden.
Darin ist nicht die Zeit für die 10000 Aufrufe der Methoden bzw. Funktionen
append(),
min() und remove() enthalten.
In der nächsten Spalte (
percall) steht die Gesamtzeit (ohne interne Funktionsaufrufe) für
einen einzigen Aufruf der betreffenden Funktion.
Die kumulierte Ausführungszeit (
cumtime) in der vierten Spalte ist die gesamte Ausfüh-
rungszeit aller Aufrufe der Funktion einschließlich interner Funktionsaufrufe.
In der fünften Spalte (
percall) steht die kumulierte Ausführungszeit für einen einzigen
Funktionsaufruf. Im Falle der Funktion
sort() im obigen Beispiel ist dies die Summe der
Ausführungszeiten für die 10000 internen Aufrufe der Standardfunktionen
append(),
min() und remove() und der Gesamtzeit pro Aufruf in Spalte 3.
Die letzte Spalte schließlich spezifiziert die Funktion bzw. Methode.
25.6.2 Praxisbeispiel: Auswertung astronomischer Fotografien
Automatische Bildverarbeitung ist ein relativ neues Feld der Informatik mit großem
Anwendungspotenzial. Es gibt inzwischen Systeme, die Fingerabdrücke oder Gesichter
erkennen können. Autonome Roboter nehmen über Kameras Objekte ihrer Umwelt wahr
und verwenden diese Information zur Steuerung ihres Verhaltens.
In all diesen Fällen ist das Ausgangsmaterial eine zweidimensionale Matrix, in der die Farb-
werte von vielen Tausend Bildpunkten (Pixel = Picture Element) gespeichert sind. Diese gro-
ßen Datenmengen müssen möglichst schnell (bei Robotern sogar in Echtzeit) verarbeitet
werden. Performancemessungen spielen hier also bei der Programmentwicklung eine
große Rolle.
Als Praxisbeispiel entwickeln wir ein Programm, das die Sterne auf einer Himmelsfotogra-
fie zählt. Abbildung 25.4 zeigt einen Screenshot der Benutzungsoberfläche. Nach einem
Klick auf die Schaltfläche L
ADEN kann über eine Dialogbox eine neue Bilddatei geladen wer-
den. Nach Betätigung des Buttons Z
ÄHLEN werden die Sterne auf dem Foto gezählt und die
Anzahl ausgegeben.
Abb. 25.4: Benutzungsoberfläche des Programms starwatch.pyw. Das Bild zeigt ein
handgefertigtes Sternenbild mit bekannter Sternenzahl (7) zum Testen.
Kapitel 25
Testen und Tuning
704
Wir entwickeln ein objektorientiertes Programmsystem aus zwei Modulen, die in zwei
Dateien namens
starwatch.pyw und stars.py abgespeichert sind. Das erste Modul ent-
hält die grafische Benutzungsoberfläche und das zweite die Definition der Klassen zur
Repräsentation des Sternenhimmels.
Die Benutzungsoberfläche
Zur Verarbeitung des Bildes verwenden wir die Klasse PhotoImage aus dem Modul tkinter
(siehe Abschnitt 17.2). Das bedeutet, dass das Foto als GIF-Datei oder PNG-Datei vorliegen
muss. Bilder in anderen Formaten müssen vorher mit einem Grafikprogramm in das GIF-
Format überführt werden. Das folgende Skript zeigt eine Implementierung des Anwen-
dungsfensters aus Abbildung 25.4.
Skript 1:
#starwatch.pyw
from tkinter import *
fro m sta r s imp o r t * #1
from tkinter import filedialog
DEFAULT_PATH = "bilder/wagen.gif"
class Starwatch(object):
def __init__ (self):
self.__createWidgets()
self.sky = Sky(self.image) #2
self.__layout()
self.window.mainloop()
def __createWidgets(self):
self.window = Tk()
self.window.title("Sterne z\xe4hlen")
self.image = PhotoImage(file=DEFAULT_PATH)
self.canvas = Canvas(master=self.window,
width="9c", height="5c")
self.imageID = self.canvas.create_image(0, 0,
image = self.image, anchor=NW)
self.buttonLoad = Button(master=self.window,
t ext = "Lad e n",
c omm a nd=s e lf. l o a d)
self.buttonCount = Button(master=self.window,
t ext = "Z\x e 4hl e n " ,
c omm a nd=s e lf. c o u nt )
self.labelCount=Label(master=self.window, width=4,
f g=" b l ue" )
705
25.6
Tuning
Erläuterung 1:
#1: Import der Klassendefinitionen aus dem Modul stars (Skript 2).
#2: Generiert mithilfe des Bildes ein neues Objekt der Klasse Sternenhimmel.
#3: Über eine Dialogbox wird ein Dateiname (keine Datei) ausgewählt.
#4: Sofern vom Benutzer tatsächlich ein Dateiname ausgewählt worden ist (und der Vor-
gang nicht abgebrochen worden ist), wird ein neues Bild-Objekt der
tkinter-Klasse Pho-
toImage
erzeugt.
#5: Nach der Konfiguration des Labels mit dem Sternenbild in der vorigen Zeile muss main-
loop()
wieder aufgerufen werden, damit das Bild auch in dem Anwendungsfenster darge-
stellt wird.
#6: Die Methode count() liefert die Anzahl der Sterne auf dem Bild als ganze Zahl, die mit
str() in eine Zeichenkette überführt wird.
#7: Die Anzahl der Sterne wird durch Konfiguration des zuständigen Label-Widgets auf dem
Bildschirm dargestellt.
Modellierung des Sternenhimmels
Was ist ein Sternenhimmel? Einen Stern auf einer Himmelsfotografie kann man als
Ansammlung von hellen Punkten auffassen. Jeder Punkt eines Fotos (Objekt der
Tkinter-
def __layout(self):
self.canvas.pack()
self.buttonLoad.pack(side=LEFT)
self.buttonCount.pack(side=LEFT)
Label(master = self.window,
text="Gez\xe4hlte Sterne:").pack(side=LEFT)
self.labelCount.pack(side=LEFT)
def load (self):
path = filedialog.askopenfilename() #3
i f p ath :
self.image = PhotoImage(file=path) #4
self.canvas.itemconfigure(self.imageID,
i m a ge= s elf . i mag e )
self.sky = Sky(self.image)
self.window.mainloop() #5
def count (self):
number = str(self.sky.count()) #6
self.labelCount.config(text=number) #7
sw = Starwatch()

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.