====== 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 ====
- **Vorher messen** mit ''timeit'' ([[modul:m323:learningunits:lu07:messen|LU07f]]): ''min(timeit.repeat(funktion, number=1, repeat=5))''.
- Massnahme umsetzen.
- **Ergebnis prüfen** mit ''assert alt == neu''. Eine schnellere Funktion mit anderem Ergebnis ist keine Optimierung, sondern ein Bug.
- **Nachher messen** und in ''MESSUNGEN.md'' festhalten.
- 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 [[modul:m323:learningunits:lu02:byvaluebyreference|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
{{tag>M323-LU07 M323-D1I}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi