Python Zeit und Tabelle?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ich denke mal, du müsstest dir noch einmal genauer überlegen, was du nun eigentlich messen möchtest und inwieweit das Sinn ergibt.

Der Timer startet bei dir noch vor der Nutzereingabe, die das Ergebnis immens verzerren kann. Es hängt immerhin davon ab, wie schnell der Anwender etwas in die Konsole eingibt. Das daraufhin folgende Befüllen der Liste ist natürlich abhängig von der Eingabe: Bei einer großen Zahl dauert es länger, bei einer kleinen Zahl nicht. Deshalb würde mich eine Zeitmessung für diese Operation nicht sonderlich interessieren.

Den Sortierprozess wiederum klammerst du für die erste Runde aus, denn du ermittelst die Endzeit, bevor die Funktion überhaupt aufgerufen wurde. Für nachfolgende Intervalle ziehst du die Laufzeit der vorherigen Intervalle nicht ab.

Konkrete Ratschläge zur Verbesserung des Programms:

1) Die bubblesort-Funktion würde ich außerhalb der Schleife definieren. Am besten noch vor allem anderen Code (unter den Imports), um das Programm übersichtlicher zu strukturieren.

In diesem Zuge solltest du noch einmal den Algorithmus der Funktion hinterfragen. Die Sortierung funktioniert nur, da du für die Ausgangsliste (zahlenliste) die sort-Funktion aufrufst, die auf einem anderen Sortieralgoritmus (Tim sort) basiert. Nach Bubblesort-Prinzip wird die Liste (liste / zahlenliste) nicht sortiert.

2) Verwende aussagekräftige Bezeichner (z.B. testlauf statt t, max_varianz statt a, ...).

3) Wirf unnötigen Code hinaus. Der auskommentierte Code wird beispielsweise nicht gebraucht und die Variable z kann von testlauf ersetzt werden.

4) Da du die jeweiligen Messergebnisse in einer Tabelle haben möchtest, aber zwischendurch immer wieder Nutzereingaben abfragst, solltest du entweder den Ablauf des Programms ändern (z.B. am Anfang drei Nutzereingaben abfragen, statt je Testlauf nur eine) oder die Zeichenketten zwischenspeichern (miteinander konkatenieren / in einer Liste speichern / ...). Dann kannst du sie später noch einmal gebündelt ausgeben.

Beispiel:

ergebnisse = []

while testlauf < 3:
  # ...
  ergebnisse.append("...")

[print(ergebnis) for ergebnis in ergebnisse]

5) Für die Zeitmessung brauchst du die Differenz zwischen zwei Zeitstempeln.

start = time.time()
# ...
dauer = time.time() - start

Wenn du nach diesem Code ein weiteres Mal eine Zeitdifferenz ermitteln möchtest, musst du bedenken, dass die erstermittelte Differenz abgezogen werden muss. Im einfachsten Fall setzt du start einfach neu (auf den Wert der Endzeit / eines aktuellen Zeitstempels).

start = time.time()
# ...
ende = time.time()
dauer = ende - start

start = ende
# ...
ende = time.time()
dauer = ende - start

Solltest du tatsächlich auch Operationen wie die Eingabe oder die Füllzeit messen wollen, würde ich empfehlen, die Zeiten dennoch als separate Werte zu speichern / in der Tabelle darzustellen. So kann man das Ergebnis später besser interpretieren.

HUFOL 
Fragesteller
 29.10.2023, 18:18

Vielen Dank. Die bubblesort Funktion wollte ich auch noch hoch setzten. Für deinen 2. Tipp, ich hatte das davor so ähnlich, hatte aber nicht funktioniert, vermutlich wegen Schreibfehler. Für deinen 3. Tipp, ich finde es so etwas übersichtlicher, da ich noch nicht viel mit Python gemacht habe. Dein 5. Hinweis verstehe ich nicht richtig.

0
regex9  29.10.2023, 18:50
@HUFOL
Für deinen 3. Tipp, ich finde es so etwas übersichtlicher, da ich noch nicht viel mit Python gemacht habe.

Das kann ich nicht nachvollziehen. Das ist doch alles irrelevanter Code, der lediglich die Anzahl an Zeilen im Editor steigert.

Aber ja, letzten Endes ist es von mir nur ein Ratschlag.

Dein 5. Hinweis verstehe ich nicht richtig.

Schau dir an, wie du derzeit die Zeitdifferenzen berechnest. Du veränderst die Startzeit / den Bezugspunkt zur Berechnung der Differenz nie.

Das einmal an einem einfachen Beispiel demonstriert:

start = 0
# Operation 1 braucht 4s
differenz = 4 - 0 = 4

# Operation 2 braucht 3s
differenz = 7 - 0 = 7

# Operation 3 braucht 1s
differenz = 8 - 0 = 8

Nach Auswertung müsstest du nun vermuten, dass die dritte Operation am langsamsten war und die erste Operation am schnellsten. Das stimmt aber nicht, sondern liegt daran, dass die Dauer der vorherigen Operationen immer mit hinzugerechnet wurde.

Würdest du hingegen die Startzeit immer aktualisieren oder die Dauer der vorherigen Operationen abziehen, würdest du auch die richtigen Ergebnisse erhalten.

start = 0
# Operation 1 braucht 4s
differenz = 4 - 0 = 4
start = 4

# Operation 2 braucht 3s
differenz = 7 - 4 = 3
start = 7

# Operation 3 braucht 1s
differenz = 8 - 7 = 1
0