====== 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