Programmieren für Ingenieure

Code Optimierung

In dieser Lektion möchte ich dir drei Techniken zeigen, die du beachten und einfach umsetzen kannst, um die Ausführungsgeschwindigkeit deines Codes erheblich zu erhöhen.

Das wichtigste in der Praxis ist es Probleme effizient zu lösen.
Deshalb ist es oft besser eine theoretisch unschöne, aber funktionierende Lösung bereitzustellen, als ewig an perfektem Code zu arbeiten der niemals fertig wird und eingesetzt werden kann.
Für alle Perfektionisten mit Deadlines deshalb hier drei Optimierungen, die sich meiner Erfahrung nach leicht umsetzen lassen und sehr großes Verbesserungspotential haben.

Gerade zu Beginn eines Projektes führen brute force Ansätze häufig zu schnellen Lösungen, die nichtsdestotrotz um ein Vielfaches besser sind als ihre manuellen Vorgänger Prozesse.
Wenn du an einem solchen Projekt arbeitest wird es sich auf jeden Fall lohnen, wenn du dir Zeit nimmst, um zu prüfen ob du in deinem Code eventuell komplett überflüssige Operationen ausführst.

Als nächstes kannst schauen ob du unnötig geschachtelte Schleifen entdeckst, da der Zeitaufwand an diesen Stellen exponentiell ansteigt.

import time
import random

# Geschachtelte Schleifen
x = 0
avgZeitI, avgZeitK, avgZeitM = 0, 0, 0
startZeitI = time.time()
for i in range(10):
    time.sleep(0.001)

    startZeitK = time.time()
    for k in range(10):
      time.sleep(0.001)

      startZeitM = time.time()
      for m in range(10):
        time.sleep(0.001)

      avgZeitM = (k * avgZeitM + time.time() – startZeitM) / (k + 1)
    avgZeitK = (i * avgZeitK + time.time() – startZeitK) / (i + 1)
avgZeitI = (x * avgZeitI + time.time() – startZeitI) / (x + 1)
x += 1

print(f“m: {avgZeitM}; k: {avgZeitK}; i: {avgZeitI}“)

### ERGEBNIS / AUSGABE ###
m: 0.15620799064636232; k: 1.7183674097061157; i: 17.339600086212158


Wenn du große Listen durchsuchst, kannst du viel Zeit sparen, wenn du sie zuerst sortierst.

# Sortieren
liste = [i for i in range(5000000)]
random.shuffle(liste)

for i in range(5):
    startZeit = time.time()
    if random.randint(0, 5000000) in liste:
      print(time.time() – startZeit)

liste.sort()
for i in range(5):
    startZeit = time.time()
    if random.randint(0, 5000000) in liste:
      print(time.time() – startZeit)

### ERGEBNIS / AUSGABE ###
0.12497591972351074
0.21869683265686035
0.15621304512023926
0.156174898147583
0.06252288818359375

0.01566290855407715
0.0
0.0468595027923584
0.029783964157104492
0.03124403953552246


Wenn genug freier Arbeitsspeicher zur Verfügung steht kannst du Laufzeiten optimieren indem du Dictionaries anstatt Listen verwendest.
Dieses Prinzip ist auch unter dem Namen Space – Time Tradeoff bekannt.

# Dictionaries
liste = [i for i in range(5000000)]
dictionary = {i: None for i in range(5000000)}

for i in range(5):
    x = random.randint(0, 5000000)

    startZeit = time.time()
    if x in liste:
      print(f“List: {time.time() – startZeit}“)

    startZeit = time.time()
    if x in dictionary:
      print(f“Dict: {time.time() – startZeit}“)

### ERGEBNIS / AUSGABE ###
List: 0.015621423721313477
Dict: 0.0
List: 0.015622138977050781
Dict: 0.0
List: 0.031244277954101562
Dict: 0.0
List: 0.031279563903808594
Dict: 0.0
List: 0.06248641014099121
Dict: 0.0


Ich hoffe, dass auch dir die Beachtung dieser Techniken hilft deinen Code effizienter zu machen.
Vielen Dank fürs zuschauen bis bald =)

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.