open.write() Werte Werden nicht in Datei geschrieben.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hellconnon
User
Beiträge: 4
Registriert: Donnerstag 18. Mai 2017, 17:03

Hey,
ich habe ein kleines Programm geschrieben, was verschiedene Sortiertalgorithmen auf die Laufzeit prüfen soll.
Um nicht meinen gesamten Code schicken zu müssen schreibe ich eine kurze Form.
Natürlich habe ich alles nötige importiert und die Algorithmen laufen einwandfrei, es wird auch keine Fehlermeldung ausgespuckt.

Code: Alles auswählen

a = open('/users/hellconnon/Desktop/Neuer Ordner/Zeiten.txt', 'a')
a 
anzahl1 = 100000
liste1 = [random.uniform(-1000000, 1000000) for i in range(anzahl1)]

anzahl2 = 3000000
liste2 = [random.uniform(-1000000, 1000000) for i in range(anzahl2)]

anzahl3 = 5000000
liste3 = [random.uniform(-1000000, 1000000) for i in range(anzahl3)]

zeit1 = time.clock()
insertionsort.insertionsort(liste1[:])
zeit2 = time.clock()
selectionsort.selectionsort(liste1[:])
zeit3 = time.clock()
quicksort.quicksort(liste1[:])
zeit4 = time.clock

zeitinsertionsort = zeit2 - zeit1
zeitselectionsort = zeit3 - zeit2
zeitquicksort      = zeit4 - zeit3

a.write(str(zeitinsertionsort))
a.write('\n')
a.write(str(zeitselectionsort))
a.write('\n')
a.write(str(zeitquicksort))
...
...
a.close()
Das ganze wird für die beiden anderen Listen wiederholt. Die Datei wird am Ende der letzen liste geschlossen.
Ich habe den selben Code auch schon für kürzere Listen genommen und da wurden die Zeiten ganz normal geschrieben.
Kann es sein, dass durch die Listenlänge und das Sortieren die Werte nicht mehr geschrieben werden können?
Wenn ja, wie könnte ich das Problem beheben?

Vielen Dank im Voraus
hellconnon
Zuletzt geändert von Anonymous am Donnerstag 18. Mai 2017, 17:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@hellconnon: Nein, das kann nicht sein.

Die zweite Zeile macht keinen Sinn.

Und die Aufteilung ist komisch und in den Auslassungspunkten ist Code der zu viel ist. Statt lauter durchnummerierte Namen zu haben, würde man eher eine Schleife über die Anzahl schreiben, in der eine Schleife über die verschiedenen Sortierfunktionen steckt, statt so viel Code zu schreiben und Namen zu nummerieren.

In der Zeitmessung ist die Kopie der Liste mit enthalten, was IMHO nicht zum sortieren gehört.

Man würde zudem auch nicht jedes nur einmal messen, sondern aus mehreren Messungen die beste auswählen. Das gibt es alles schon fertig im `timeit`-Modul in der Standardbibliothek.
hellconnon
User
Beiträge: 4
Registriert: Donnerstag 18. Mai 2017, 17:03

BlackJack hat geschrieben:Die zweite Zeile macht keinen Sinn.
Okay, das habe ich geändert
BlackJack hat geschrieben:In der Zeitmessung ist die Kopie der Liste mit enthalten, was IMHO nicht zum sortieren gehört.
Ich muss das aber so machen, da sonst die sortierte Liste als Argument an den nächsten Algorithmus übergeben wird.
BlackJack hat geschrieben:Man würde zudem auch nicht jedes nur einmal messen, sondern aus mehreren Messungen die beste auswählen. Das gibt es alles schon fertig im `timeit`-Modul in der Standardbibliothek.
Was heißt: "Die beste Messung" Ich soll eine Kurve anlegen, die mir den Anstieg der gebrauchten Zeit in Verhältnis der Listenlänge darstellt.

Wenn es nicht an der Listenlänge liegen kann, kann ich mir nicht erklären, woran es sonst liegen sollte, da es bei eine Liste mit anzahl=10000 genau so funktioniert hat.
Mal abgesehen von den Schönheitsfehlern funktioniert das ganze ja.
BlackJack

Klar musst Du eine Kopie der Liste nehmen, aber niemand zwingt Dich das kopieren innerhalb der Zeitmessung zu machen. Das macht man einfach *davor*.

Die beste Messung heisst man misst das sortieren mit den *gleichen* Parametern, also Sortierfunktion und Eingabedaten, mehrfach und nimmt davon die beste Zeit. Damit rechnet man Schwankungen heraus die dadurch entstehen, dass das Programm nicht das einzige ist das läuft und auf Prozessoren die je nach Auslastung den Takt verändern, fällt man dann auch nicht auf eine eventuell sehr lahme erste Messung rein. Wenn nämlich ein Teil der Messungen gemacht wird während der Prozessor noch langsam ist und dann erst hochgetaktet wird, sind die Messergebnisse nicht mehr vergleichbar, weil späteren Messungen ein schneller arbeitender Prozessor zur Verfügung stand.
hellconnon
User
Beiträge: 4
Registriert: Donnerstag 18. Mai 2017, 17:03

Ah okay, vielen dank :)
Wie würde ich die Liste am geschicktesten vorher kopieren, du sagtest ja,
ich soll eine Schleife schreiben, die einfach die Algorithmen nimmt und dann diesen das Argument gibt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@hellconnon: timeit hat einen setup-Parameter für's Kopieren der Liste. Und Funktionen sind genauso Objekte, die man in eine Liste stecken kann und über die man in einer for-Schleife iterieren kann.
hellconnon
User
Beiträge: 4
Registriert: Donnerstag 18. Mai 2017, 17:03

@Sirius3 @BlackJack
Vielen Dank für die Hilfe :)
Antworten