Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m323:learningunits:lu07:aufgaben:performance [2026/09/09 11:16] – LU07.A08 - Vorgegebene Massnahmen umsetzen (neu) adminmodul:m323:learningunits:lu07:aufgaben:performance [2026/09/09 13:53] (aktuell) – Repo-Verlinkung korrigiert: nodisp im Footer statt Link im Text admin
Zeile 5: Zeile 5:
 </WRAP> </WRAP>
  
-==== Ausgangslage ====+==== Die vier Massnahmen ====
  
-<code python> +^ Nr. ^ Funktion ^ Vorgegebene Massnahme ^ 
-import random +| 1 | ''gesperrte_anfragen'' | geeignetere Datenstruktur wählen | 
-random.seed(42)+| 2 | ''zuordnen'' | innere Schleife durch einen Index ersetzen | 
 +| 3 | ''fibonacci'' | Memoization einsetzen | 
 +| 4 | ''top_drei_pro_kunde'' | unveränderliche Arbeit aus der Schleife ziehen |
  
-gesperrt = [f"user{i}" for i in range(10000)+Die Testdaten erzeugt ''main.py'' selbst und reproduzierbar (fester Seed). Die Signaturen bleiben unverändert, sonst laufen die Tests nicht.
-anfragen = [f"user{random.randrange(20000)}" for _ in range(2000)]+
  
-kunden [{"id": i, "name": f"K{i}"} for i in range(2000)] +==== Detaillierte Aufgabenstellung ====
-bestellungen [{"kunde_id": random.randrange(2000), "betrag": 10} for _ in range(2000)] +
-</code>+
  
-=== Massnahme 1 === +  - **Vorher messen** mit ''timeit'' ([[modul:m323:learningunits:lu07:messen|LU07f]]): ''min(timeit.repeat(funktion, number=1, repeat=5))''. 
-<code python> +  - Massnahme umsetzen. 
-def gesperrte_anfragen(anfragen, gesperrt): +  **Ergebnis prüfen** mit ''assert alt == neu''. Eine schnellere Funktion mit anderem Ergebnis ist keine Optimierung, sondern ein Bug. 
-    return sum(1 for a in anfragen if a in gesperrt+  - **Nachher messen** und in ''MESSUNGEN.md'' festhalten. 
-</code> +  - Zu jeder Massnahme in einem Satz begründen: **Warum** ist die neue Fassung schneller? Nennen Sie die Komplexität, nicht nur «ist schneller».
-**Vorgabe:** Ersetzen Sie die Datenstruktur für ''gesperrt''.+
  
-=== Massnahme 2 === +==== Abgabe ====
-<code python> +
-def zuordnen(bestellungen, kunden): +
-    out [] +
-    for b in bestellungen: +
-        for k in kunden: +
-            if k["id"== b["kunde_id"]: +
-                out.append((k["name"], b["betrag"])) +
-                break +
-    return out +
-</code> +
-**Vorgabe:** Ersetzen Sie die innere Schleife durch einen Index.+
  
-=== Massnahme 3 === +Eine Tabelle mit fünf Spalten: Massnahme, vorher (s), nachher (s), Faktor, Begründung.
-<code python> +
-def fibonacci(n)+
-    return n if n < 2 else fibonacci(n - 1+ fibonacci(n - 2) +
-</code> +
-**Vorgabe:** Setzen Sie Memoization ein.+
  
-=== Massnahme 4 === +==== Bewertung ====
-<code python> +
-def top_drei_pro_kunde(kunden, produkte): +
-    ergebnis {} +
-    for k in kunden: +
-        top sorted(produkte, key=lambda p: p["preis"])[:3] +
-        ergebnis[k["name"]] = [p["name"] for p in top] +
-    return ergebnis +
-</code> +
-**Vorgabe:** Ziehen Sie unveränderliche Arbeit aus der Schleife heraus.+
  
-==== Detaillierte Aufgabenstellung ====+^ Teil ^ Punkte ^ 
 +| Tests (''main_test.py'') | 14 | 
 +| pylint (''main.py'') | 5 |
  
-  - Messen Sie **vor** der Änderung mit ''timeit'' ([[modul:m323:learningunits:lu07:messen|LU07f]]): ''min(timeit.repeat(funktion, number=1, repeat=5))''+Die Tests prüfen zweierlei: identisches Ergebnis **und** mindestens Faktor 20 gegenüber der langsamen Referenzfassung im TestfileDer Faktor ist bewusst tief angesetzt; wer die Massnahme richtig umsetzterreicht ein Vielfaches.
-  - Setzen Sie die Massnahme um. +
-  - Prüfen Sie mit ''assert alt(...) == neu(...)''dass das Ergebnis identisch bleibt. +
-  - Messen Sie nach und halten Sie beide Zahlen sowie den Faktor fest. +
-  - Notieren Sie zu jeder Massnahme in einem Satz: **Warum** ist die neue Fassung schneller?+
  
-==== Abgabe ====+<WRAP center round important 80%> 
 +**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]]. 
 +</WRAP>
  
-Eine Tabelle mit fünf Spalten: Massnahme, vorher (s), nachher (s), Faktor, Begründung.+<WRAP center round tip 80%> 
 +**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. 
 +</WRAP>
  
 ---- ----
 +<nodisp>https://github.com/templates-python/m323-lu07-a08-performance</nodisp>
 {{tag>M323-LU07 M323-D1I}} {{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 [[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
  
  • modul/m323/learningunits/lu07/aufgaben/performance.1788945382.txt.gz
  • Zuletzt geändert: 2026/09/09 11:16
  • von admin