Matplotlib sehr langsam

  • Hallo zusammen,

    ich möchte mit Python das Pascal'sche Dreieck plotten. Die einzelnen Zahlen werden durch rote Punkte repräsentiert. Zuvor festgelegte Kandidaten werden blau markiert.

    Mein Vorgehen ist folgendes:

    - Ein Punkt wird als Liste der Form (Binomialkoeffizient, x-Koordinate, y-Koordinate) in der Liste punkte abgelegt.

    - Die zu markierenden Kandidaten werden in der Liste kandidaten aufgeschrieben.

    - Nun werden alle Punkte geplottet. Sollte der jeweils erste Eintrag des Tupels aus der Liste punkte in der Liste kandidaten auftauchen, wird der Punkt blau gefärbt, sonst rot.

    Das klappt auch alles und ich bekomme eine schöne Form. Im folgenden Bild sind die ersten 50 Zeilen dargestellt. Alle durch 3 teilbaren Zahlen sind blau:

    Nun kommt mir das ganze aber sehr langsam vor. Diese Zeichnung hier hat 4 Sekunden gedauert, und jedesmal wenn meine IDE Thonny eine figure aufruft, dauert das nohcmal mehrere Sekunden. 150 Zeilen zu zeichnen hat schon über eine Minute gedauert. Was kann ich optimieren?

    Hier mein Code:

    Danke und Grüße

  • Probier mal diese Version:

    Wie lange dauert das auf deinem System?

    Die Idee dahinter: math-Funktionen eliminieren und nur einen Aufruf von matplotlib.

    Einmal editiert, zuletzt von Tell (4. April 2022 um 07:48)

  • Wow, das geht ja blitzschnell!

    Ich habe mal 1000 Zeilen geplottet.

    Das Abarbeiten der Zeilen 1 bis 42 dauert weniger als 0.5 Sekunden.

    Das Laden des figure-Fensters dauert dann nochmal 20 Sekunden. Ist das normal?

    Vielen Dank bis hierher, das ist ja eine großartige Verbesserung!

  • > Das Laden des figure-Fensters dauert dann nochmal 20 Sekunden. Ist das normal?

    1000 Zeilen sind 500500 Punkte!

    matplotlib muss das Minimum und das Maximum in X- und Y-Richtung bestimmen, die Achsen entsprechend skalieren und dann die Punkte skalieren und einzeichnen. Wundert mich nicht dass das etwas dauert.

  • Danke sehr, das leuchtet ein.

    Dazu hätte ich noch zwei weitere Fragen:

    1) Könnte ich dem matplotlib auch sagen, dass er es dynamisch plotten soll? Also die ersten 100 zeilen sodass ich sie auch sehe, dann die nächsten 100 unten dran und so weiter...?

    2) Wenn ich mit der Maus über einem Punkt bin, kann ich dann ein Hoverfeld mit dem gezeigten Binomialkoeffizienten aufgehen lassen?

    Gerne könnt ihr mir auch Stichworte zum googlen geben, ich habe bisher nichts (für mich verständliches) gefunden.

  • > 1) Könnte ich dem matplotlib auch sagen, dass er es dynamisch plotten soll?

    Ja.das ist moeglich, zum Beispiel mit FuncAnimation(...). In diesem Fall wuerde ich die Achsen fixieren, sonst wird bei jeder Runde neu skaliert.

    plt.pause(...) habe ich auch schon gesehen, das funktioniert wahrscheinlich auch.

    > 2) Wenn ich mit der Maus über einem Punkt bin, kann ich dann ein Hoverfeld mit dem gezeigten Binomialkoeffizienten aufgehen lassen?

    Habe ich bei reinem matplotlib noch nicht gesehen, aber plotly kann das. bokeh kann es zumindest fuer Bar-Charts.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!