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:
import matplotlib as mpl
import matplotlib.pyplot as plt
import time
import math
def punkt(x,y, markertype=".", size=5, farbe=0):
colors = ["red", "blue"]
return plt.plot(x,y, marker = markertype, markersize = size,
color = colors[farbe % 2])
def binom(n, k, mod=0):
if mod == 0:
return int(math.factorial(n)/(math.factorial(k) * math.factorial(n-k)))
return int((math.factorial(n)/(math.factorial(k) * math.factorial(n-k)))%mod)
start = time.time()
n = 40
punkte = []
for i in range(0, n):
for j in range(0, i+1):
punkte.append((binom(i, j),-i+2*j, -i))
ende = time.time()
print("Die Berechnung hat",ende-start,"Sekunden gedauert.")
kandidaten = list(range(0,10**6,3))
c = 0
start = time.time()
for _ in punkte:
if _[0] in kandidaten:
c=1
punkt(_[1], _[2], ".", 5, c)
c=0
print("Das Zeichnen hat", time.time()-start,"Sekunden gedauert.")
plt.show()
Alles anzeigen
Danke und Grüße