Foren » Bundeswettbewerb Informatik Allgemein

Optimierung und "build-ins"

    • 16 Beiträge
    1. Oktober 2021 20:53:32 CEST

    Guten Tag,

    Ich habe einige implementierungsspezifische Fragen zur Bewertung.

    Wie wichtig ist die Programmoptimierung, ist sie gar das oberste Ziel oder ist Klarheit und Verständlichkeit wichtiger?

    Konkret anhand einiger Beispiel in der Programmiersprache Python:

    1. Sollte ich eher das schnellere
      list_of_lists: List[list[int]] map(sum, list_of_lists)
      oder[sum(l) for l in list_of_lists]verwenden?
    2. Sollte ich anstelle
      min_number = min(list_of_numbers) index = list_of_numbers.index(min_number)​ eine eigene Implementation mit nur einer Iteration der Liste verwenden?
    3. Sollte ich generell spezifische Funktionen einer Programmiersprache vermeiden und muss ich in der Dokumentation "build-ins" erklären?

    Vielen Dank!

    Mit freundlichen Grüßen

    PN


    Dieser Beitrag wurde am 1. Oktober 2021 20:54:37 CEST von privater Realname bearbeitet
    • 6 Beiträge
    2. Oktober 2021 10:46:35 CEST

    Hallo,

    ich würde sagen die Verständlichkeit ist wichtiger als solche Mikrooptimierungen. Ob man einmal oder zweimal über die Liste iteriert mach in der Regel keinen großen Unterschied. Wichtiger ist die theoretische Laufzeit (Big-O Notation).

    Zu 2 und 3: Ich hätte keine Bedenken built-ins zu benutzen. Die Leute die sich Deine Lösung anschauen können schließlich Programmieren. Es macht das Programm eher schwerer verständlich, wenn man für Funktionen wie min() oder index() eigene Funktionen implementiert.

     

    • 16 Beiträge
    2. Oktober 2021 18:25:57 CEST
    Vielen Dank für Ihre schnelle Antwort.
    Das wenige ,das ich von der Komplexitätstheorie weiß, lässt mich meinen, dass jede Iteration die theoretische Laufzeit bzw. die Komplexität des Algorithmus erhöht.

    Über weitere Meinungen zum obigen Post würde ich mich freuen.

    Mit freundlichen Grüßen
    PN
    Dieser Beitrag wurde am 2. Oktober 2021 18:26:17 CEST von privater Realname bearbeitet
    • 17 Beiträge
    4. Oktober 2021 15:54:21 CEST

    Hallo,

    Tobias weist auf etwas wichtiges hin: Die asymptotische Laufzeit (Groß-O-Notation) ist bzgl. der Effizienz meist am wichtigsten. In dieser Notation hat ein Algorithmus, der eine Liste zwei- statt einmal durchgeht, die gleiche (lineare) theoretische Laufzeit, während beispielsweise ein Algorithmus, der alle Paare von Elementen der Liste durchgeht, eine quadratische Laufzeit hätte. Dieser Unterschied ist deshalb so bedeutend, weil er viel über die Skalierbarkeit des Algorithmus verrät: Im ersteren Fall verdoppelt sich die Laufzeit bei doppelt so großer Eingabegröße, im letzteren vervierfacht sie sich.

    Nichtsdestoweniger wird ein Programm natürlich wirklich langsamer, wenn es mehr Iterationen enthält (in Deinem Beispiel würde es, für diese eine Instruktion, doppelt so lange brauchen). Wo sich das ohne größere Auswirkungen auf die Lesbarkeit vermeiden lässt und sich nennenswert auf die tatsächliche Gesamtlaufzeit auswirkt, spricht sicherlich nichts dagegen.

    Etwas konkreter zu Deinen Punkten:

    1. Beide Varianten haben Vorteile, welche Du wählst, bleibt Dir überlassen -- die Bewerter werden beides verstehen.
    2. Wäre auch beides OK -- eine eigene Implementation wäre aber nicht unbedingt schlechter zu verstehen. Und vielleicht geht das in Python ja sogar noch etwas eleganter? ;)
    3. Den schon vorhandenen Funktionen einer Programmiersprache sollte man im Zweifel sogar den Vorzug geben -- sie sind am verständlichsten und verlässlich implementiert. Erklären sollte man die "Tools" einer Programmiersprache nur dann, wenn man sie auf besonders unintuitive oder leicht misszuverstehende Weise verwendet.