LU07.A08 - Vorgegebene Massnahmen umsetzen

Setzen Sie vier vorgegebene Performance-Massnahmen um und belegen Sie jede mit einer Messung vorher und nachher.

Die vier Massnahmen

Nr. Funktion Vorgegebene Massnahme
1 gesperrte_anfragen geeignetere Datenstruktur wählen
2 zuordnen innere Schleife durch einen Index ersetzen
3 fibonacci Memoization einsetzen
4 top_drei_pro_kunde unveränderliche Arbeit aus der Schleife ziehen

Die Testdaten erzeugt main.py selbst und reproduzierbar (fester Seed). Die Signaturen bleiben unverändert, sonst laufen die Tests nicht.

Detaillierte Aufgabenstellung

  1. Vorher messen mit timeit (LU07f): min(timeit.repeat(funktion, number=1, repeat=5)).
  2. Massnahme umsetzen.
  3. Ergebnis prüfen mit assert alt == neu. Eine schnellere Funktion mit anderem Ergebnis ist keine Optimierung, sondern ein Bug.
  4. Nachher messen und in MESSUNGEN.md festhalten.
  5. Zu jeder Massnahme in einem Satz begründen: Warum ist die neue Fassung schneller? Nennen Sie die Komplexität, nicht nur «ist schneller».

Abgabe

Eine Tabelle mit fünf Spalten: Massnahme, vorher (s), nachher (s), Faktor, Begründung.

Bewertung

Teil Punkte
Tests (main_test.py) 14
pylint (main.py) 5

Die Tests prüfen zweierlei: identisches Ergebnis und mindestens Faktor 20 gegenüber der langsamen Referenzfassung im Testfile. Der Faktor ist bewusst tief angesetzt; wer die Massnahme richtig umsetzt, erreicht ein Vielfaches.

Achtung bei Massnahme 4: Die naheliegende Lösung teilt allen Kunden dieselbe Liste zu. Solange niemand sie verändert, fällt das nicht auf. test_top_drei_listen_sind_unabhaengig fängt es ab - der Referenz-Effekt aus LU02d.

Achtung bei Massnahme 2: Die Vorher-Version überspringt Bestellungen ohne passenden Kunden stillschweigend. Ein reiner Index-Zugriff wirft dort einen KeyError - das wäre eine Verhaltensänderung.


https://github.com/templates-python/m323-lu07-a08-performance

© Kevin Maurizi