Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Matroids Matheplanet Forum Index » Informatik » Python: Geschwindigkeit
Autor
Schule Python: Geschwindigkeit
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2518
  Themenstart: 2021-07-30

Hallo, was ist prinzipiell oder tendentiell schneller: Ein Problem über eine ausgelagerte Funktion lösen lasse und mit import Def importieren oder im Programm selber eine Schleife laufen haben?


   Profil
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 3000
  Beitrag No.1, eingetragen 2021-07-30

Ich bezweifle, dass es dir gelingt, bei einer halbwegs komplexen Funktion einen Unterschied zu messen. Unabhängig davon macht solche Mikrooptimierung quasi niemals Sinn. Falls deine üblichen Programme dir zu langsam sind, liegt das schlichtweg an den ineffizienten Algorithmen.


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 40
  Beitrag No.2, eingetragen 2021-09-24

@Bekell: Prinzipiell ist eine eingebettete Schleife schneller als eine Funktion aufzurufen, weil der Aufruf Zeit kostet. Nachteil ist aber das man sich den Inhalt der aufgerufenen Funktion in die aufrufende Funktion holt, was diese länger und unübersichtlicher machen kann. Man holt sich in der Regel auch zusätzliche lokale Namen in die aufrufende Funktion, was auch auf die Verständlichkeit gehen kann, weil man dann mehr auf einmal im Kopf haben muss, wenn man diese Funktion verstehen oder gar bearbeiten will. Und wenn man sich den Inhalt in eine Schleife holt, fangen die ehemals lokalen Variablen nicht bei jedem Schleifendurchlauf an nicht zu existieren. Wodurch man Ablauffehler die durch nicht ordentlich initialisierte Variablen nicht deutlich durch eine Ausnahme bemerkt. Da wird dann einfach still der Wert vom letzten Schleifendurchlauf wiederverwendet, was in der Regel falsch ist. Das fällt dann nur durch Folgefehler oder falsche Ergebnisse auf. Wenn letzteres denn (schnell) auffällt. Bevor man sich über so etwas Gedanken macht, sollte man erst einmal auf Verständlichkeit des Programmquelltextes und Korrektheit der Ergebnisse achten. Und gegebenenfalls auch auf gute Testbarkeit um letzteres zu überprüfen. Das spricht alles dafür den Code sinnvoll auf gut verständliche und separat testbare Funktionen aufzuteilen. Wenn das dann irgendwo objektiv zu langsam ist, dann ist der nächste Schritt zu *messen* wo am meisten Zeit verbraucht wird, mit den meisten Aufrufen, um den/die Flaschenhälse zu identifizieren wo es sich am meisten lohnt Zeit für Optimierungen zu investieren. Dort sollte man dann erst einmal schauen ob es einen effizienteren Algorithmus/eine effizientere Datenstruktur gibt, oder ob gleiche Teilergebnisse unnötig oft berechnet werden. Beispiel was ich hier bei Dir schon gesehen habe ist eine Liste zu verwenden um zu testen ob Elemente in ihr enthalten sind. Da kann ein `set()` sinnvoller/effizienter sein. Und sollte man wirklich an den Punkt kommen, wo man Mikrooptimierungen ”braucht”, die den Quelltext schlechter verständlich, und damit auch fehleranfälliger machen, muss man sich eventuell auch fragen, ob Python die richtige Sprache dafür ist. PyPy wäre dann noch eine Option falls das Programm/Projekt keine Abhängigkeiten hat, die sich mit dieser Python-Implementierung nicht vertragen. Oder man schreibt Teile die zu langsam sind in C oder Pyrex (Untermenge von Python + Annotationen die zu C-Erweiterungsmodulen übersetzt werden).


   Profil
Bekell wird per Mail über neue Antworten informiert.

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]