Seite 6 von 10
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:28
von jens
hier fehlt ein
goto: "topic start" 
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:36
von Alfons Mittelmeyer
BlackJack hat geschrieben:@Alfons Mittelmeyer: Okay, mit der letzten Programmzeile bin ich hier raus. Das macht keinen Sinn. :K
Die letzte Zeile macht viel Sinn. Angenommen du hast eine Funktion und die enthält eine print Anweisung, die ein Lexikon ausgibt.
Und wenn man dann die Funktion nicht löscht, dann ist das ganze Lexikon noch im Speicher. Und die Funktion hatte ihren Zweck erfüllt, nämlich das Lexikon ausgeben. Und weil man das nicht so schnell wieder tun will, löscht man das am Besten.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:45
von BlackJack
@jens: GOTO gibt's ja als Modul. Man darf dann nur nicht vergessen die Sprungmarken zu löschen nach dem sie das letzte mal angesprungen wurden, denn man möchte ja keinen wertvollen Speicher verschwenden.
@Alfons Mittelmeyer: Die letzte Zeile mach keinen Sinn, denn Deine Annahme in einer Funktion eine ``print``-Anweisung mit einem Lexikon als Ausgabetext zu haben ist schon total weltfremd. Das würde kein Programmierer machen. In CPython schon gar nicht weil da die Grössenbeschränkung eines Moduls das ”Lexikon” auf 64KiB (abzüglich Code für die Funktionsdefinition, das ``del``, und das ``print``) dazwischen funkt. Grosse Datenmengen werden nicht in Funktionen gespeichert sondern in Datendateien.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:49
von Alfons Mittelmeyer
Ja klar würde man das bei einem Lexikon nicht so machen. Aber mit einer GUI ist es dasselbe. Man hat eine Funktion, welche die GUI erstellt. Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:56
von jens
Alfons Mittelmeyer hat geschrieben:Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
GOTO "Beweise"
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 13:57
von Sirius3
@Alfons Mittelmeyer: Python ist nicht Deine Sprache. Auch jedes produktiv eingesetzte Betriebssystem ist nicht für Dich geeignet, weil keines explizit den Speicher des Initialisierungscodes wieder freigibt. Geh in den Embedded-Bereich, die suchen bestimmt noch so Talente wie Dich.
Nochwas: warum nennst Du Deine Funktionen function? Einfach 'f' würde achtmal weniger Speicher verbrauchen. Und da Du sowieso alle Namen recycles, werden Dir die 52 einbuchstabigen Varianten locker reichen.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 14:04
von Hyperion
Alfons Mittelmeyer hat geschrieben:Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
Hui... das wäre aber oftmals schlecht: Dann kann ich also nur einmal einen Speichern-Dialog aufrufen, weil die Factory-Methode danach ja nicht mehr existierte...

Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 14:05
von Alfons Mittelmeyer
jens hat geschrieben:Alfons Mittelmeyer hat geschrieben:Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
GOTO "Beweise"
GOTO Beweise kapiere ich jetzt nicht. Ein Link war es nicht. Aber man kann doch schreiben:
Code: Alles auswählen
root = Tk()
def buildGui(root):
Button() ...
Label() ...
def blink()
def irgendwas()
buildGui(root)
del buildgui
root.mainloop()
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 14:12
von Alfons Mittelmeyer
Hyperion hat geschrieben:Alfons Mittelmeyer hat geschrieben:Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
Hui... das wäre aber oftmals schlecht: Dann kann ich also nur einmal einen Speichern-Dialog aufrufen, weil die Factory-Methode danach ja nicht mehr existierte...

Natürlich würde die Factory Methode existieren, denn der Name spielt keine Rolle. Wichtig ist nur dass die Referenz dafür da ist. Wenn man auf einen Button drückt und dieser mit einer Referenz auf eine Callback Funktion vernüpft ist, ist völlig unbedeutend, ob zu dieser Funktion noch der Name existiert. Wichtig ist nur die Verknüpfung mit einer Referenz auf das Objekt oder die Funktion.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 14:13
von jens
Alfons Mittelmeyer hat geschrieben:
GOTO Beweise kapiere ich jetzt nicht. Ein Link war es nicht. Aber man kann doch schreiben:
Du wurdest mindestens einmal aufgefordert deine "Speicher sparen" Geschichte mit beweise zu unterlegen, das es überhaupt was bringt...
Aber selbst wenn hier und da ein paar Bytes RAM freiwerden sollten, wozu?
Klar Speicherfresser will niemand und man wunder sich schon, wie viel Speicher und wie groß so manches Programm denn ist. Aber das was du machst ist verglichen damit ein Mikrokosmos
Python ist jetzt nicht die Sprache, wenn es um maximale Effizienz geht. Dennoch zeigt
https://micropython.org/ das man durchaus Micro-Controller programmieren kann...
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 14:39
von Alfons Mittelmeyer
jens hat geschrieben:Du wurdest mindestens einmal aufgefordert deine "Speicher sparen" Geschichte mit beweise zu unterlegen, das es überhaupt was bringt...
Über das Lexikon hatten wir schon gesprochen, dass man es nicht im Speicher hat, sondern in einer Datenbank.
Wenn man normal Pythonprogramme startet und beeendet bringt solches Speichersparen kaum etwas. Aber wenn man Applikationen oder Teile von Applikationen in einer Datenbank hat und ohne sein Programm zu beenden, dynamisch aus der Datenbank immer andere Module dazulädt dann bringt Speicher sparen sicherlich etwas.
Und was stört es Dich, wenn wir jetzt die Lösung gefunden haben:
root = tk()
def buildGui(parent):
...
...
buildGui(root)
del buildGui
root.mainloop()
Und damit ist das Problem gelöst.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 15:09
von Hyperion
Alfons Mittelmeyer hat geschrieben:
Natürlich würde die Factory Methode existieren, denn der Name spielt keine Rolle. Wichtig ist nur dass die Referenz dafür da ist. Wenn man auf einen Button drückt und dieser mit einer Referenz auf eine Callback Funktion vernüpft ist, ist völlig unbedeutend, ob zu dieser Funktion noch der Name existiert. Wichtig ist nur die Verknüpfung mit einer Referenz auf das Objekt oder die Funktion.
Öh... nun widersrpichst Du Dir aber selber:
Alfons Mittelmeyer hat geschrieben:
Man hat eine Funktion, welche die GUI erstellt. Nachdem die GUI erstellt ist und läuft, braucht man doch die Funktion zur Erstellung der GUI nicht mehr. das wäre dann unnötiger Ballast.
:K
Darauf bezog ich mich mit meinem Einwand... passt jetzt nicht zu Deiner obigen Anwort auf mich
Im übrigen löscht Du ja auch "nur" den Namen - mehr kann man in Python natürlich auch nicht tun. Ob das Objekt dahinter gelöscht wird, kann der GC entscheiden, sofern *keine* Referenz (schlussendlich über mindestens einen Namen) mehr gegeben ist. Dein ``del function`` löscht ja auch nur den Namen ``function``. Das Objekt dahinter wird eben irgend wann gelöscht - oder auch nicht. Unweigerlich ist der Zugriff aber nicht mehr möglich, sofern Du zuvor keinen Alias angelegt hast... (was den "Sinn" hinter dem Löschen natürlich konterkarieren würde!)
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 15:14
von BlackJack
@Alfons Mittelmeyer: Wer seid denn jetzt ihr? Denn ”wir” kann hier ja nur Dich meinen, denn diese, Deine Lösung ist keine Lösung denn es gibt da gar kein Problem. Deine Lösung ist eher ein Problem weil das Unsinn ist was Du da machst. Was genau ist das Problem die ``del``-Zeile wegzulassen? Bitte eine konkrete und quantifizierte Antwort. Was wird da genau an Speicherplatz gespart. An einem konkreten Beispiel in realen Zahlen bitte und auch im Verhältniss vom gesamten Speicher der im Programmlauf belegt wird. Bitte *beweise* dass das keine sinnfreie Mikrooptimierung ist, also nenne bitte auch die Stelle im Interpreter wo da *tatsächlich* der Speicher *freigegeben* wird. Ansonsten höre bitte auf von Lösungen zu fantasieren.
Es ist auch sinnfrei immer an den Haaren herbeigezogene Extrembeispiele, wie Lexikon in Funktion oder Anwendung die dynamisch endlos viele Module aus einer Datenbank nachlädt, zu bringen. Das macht niemand. Wenn man das machen würde, dann würde man sicher auch nicht auf dieser Mikroebene kleinste Speicherfitzel bei jeder Gelegenheit freigeben, sondern ganze Programmteile entsorgen wenn diese komplett nicht mehr benötigt werden. Zum Beispiel in dem man grössere Teilprogramme in eigenen Prozessen laufen lässt. Gerade wenn das Gesamtprogramm sehr lange läuft, bei einem Server beispielsweise, ist das wesentlich ökonomischer und sicherer als manuell an jeder Stelle zu versuchen so viel wie möglich Speicher freizugeben.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 15:50
von jens
Alfons Mittelmeyer hat geschrieben:Wenn man normal Pythonprogramme startet und beeendet bringt solches Speichersparen kaum etwas. Aber wenn man Applikationen oder Teile von Applikationen in einer Datenbank hat und ohne sein Programm zu beenden, dynamisch aus der Datenbank immer andere Module dazulädt dann bringt Speicher sparen sicherlich etwas.
Die Betonung liegt hier auf "sicherlich"... Denn das nimmst du mal so an. Mache doch erstmal das, was du vorhast und kümmere dich erstmal 0 um Optimierungen...
z.Z. hängst du in der
Premature optimization is the root of all evil Endlosschleife

Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 18:19
von Alfons Mittelmeyer
@BlackJack Ich weiß nicht, was Du hast. Es macht doch überhaupt keinen Sinn, eine Funktion, die eine GUI erstellt, im Speicher zu lassen, wenn die GUI erstellt ist. Und das Lexikon ein Extrembeispiel? Aber genau das will ich. So etwas wie ein Lexikon aber mit GUI Seiten. Das heißt, es handelt sich nicht um irgendwelche Datenstrukturten, sondern um tkinter GUI. Und wenn man da solche GUI nachlädt, dann könnte es mal heißen: makeGui(parent) oder buildGui(parent) oder sonstwie. Und auf was Du beharrst, ist ja, wenn man aus einem Lexikon Seiten nachlädt, soll man die unbedingt im Speicher behalten. Aber das ist ausgemachter Unsinn. Nichts spricht dagegen, nach Ausführung einer Funktion, welche die GUI aufbaut, diese Funktion wieder zu löschen.
Oder was wäre der Sinn? Will man nach Ende des Programmes also nach mainloop() die Applikation gleich noch ein zweites mal aufrufen? Ich denke,wohl nicht!
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 18:49
von BlackJack
@Alfons Mittelmeyer: Es macht ebenfalls keinen Sinn eine Funktion die eine GUI erstellt aus dem Speicher zu löschen. Und Du hast immer noch nicht gezeigt, dass das überhaupt etwas bringt, also das da tatsächlich etwas gelöscht wird und das das mehr ist als der Zusatzaufwand den Du da betreibst. Du hast auch immer noch nicht gezeigt, dass das überhaupt ein Problem darstellt. Du ”löst” Probleme die gar nicht existieren mit ”Lösungen” deren Wirkung Du nicht beweist. Das ist komplett sinnbefreit.
Das Lexikon ist in der Tat ein Extrembeispiel weil es das nicht gibt: a) ein Lexikon das nur 64 KiB gross ist und dabei gleichzeitig b) ein Speicherproblem darstellt. Das ist Unsinn.
Und Du willst ein Lexikon das aber nicht aus Daten besteht sondern aus GUI? Was soll das denn bitte sein? Kann es sein das Du gerade sehr verzweifelt nach imaginären Problemen für Deine vermeintliche ”Lösung” suchst‽ Zeige bitte endlich mal das konkrete Problem und die konkrete Lösung mit konkreten Zahlen, und nicht Deine Vermutungen, abstrakten unrealistischen Programme, und falschen Vorstellungen von der Speicherverwaltung.
Ich beharre nicht auf Lexikonseiten sondern auf normalen Funktionen, die man nicht versucht einzeln aus dem Speicher zu löschen. Das macht niemand. Das stellt kein Problem dar. Denn sonst wäre das ja gängige Praxis. Ist es aber nicht. Was sagt Dir das? Lexikonseiten sind Daten. Daten werden nicht in Funktionen gespeichert. Jedenfalls nicht in Python. Nur Du willst das anscheinend. Alle anderen nicht. Was sagt Dir das?
Selbst wenn man das Programm nur einmal aufruft, macht es keinen Sinn jedes fitzelchen Speicher manuell freigeben zu wollen. Habe ich eigentlich schon erwähnt das Du auch erst einmal beweisen müsstest dass das in den Einzelfällen tatsächlich geschieht? Freigeben des Speichers eines Namens, also den für den Namen selber, beispielsweise funktioniert schon mal nicht so einfach. Jedenfalls nicht in CPython. Und nochmal: könntest Du bitte mal belegen dass das ganze überhaupt ein Problem darstellt?
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 19:13
von Alfons Mittelmeyer
Es ist sinnvoller, einfach nach dem Aufruf einer GUI Erstellungsfunktion noch ein del einzufügen. Denn das ist ein äußerst geringer Aufwand. Dagegen zu diskutieren mit anderen, die damit nicht einverstanden sind, ist ein sehr großer Aufwand. Und ich habe jetzt keinen Bock darauf, Crash Programme zu schreiben, um zu beweisen, daß das sehr viel bringt. Schreibt doch selber Crash Programme.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 19:20
von BlackJack
@Alfons Mittelmeyer: Es ist nicht sinnvoll das ``del`` einzufügen. Du behauptest das wiederholt, aber bleibst den Beweis schuldig. Das ist kein grosser Aufwand, aber es ist auch kein Gewinn, und damit sinnlos. So sinnlos wie mit Dir zu ”diskutieren”. Wenn's an konkretes geht kneifst Du. Ist auch einfach völlig wirres, konfuses Zeug zu posten, bei dem kein Mensch wirklich durchsteigt weil das immer nur Fragmente von extrem abwegigen Sachen sind, als tatsächlich mal konkretes, nachvollziehbares zu zeigen und mit Zahlen zu untermauern.
Was bitte sind ”Crash-Programme” in diesem Zusammenhang? Und warum soll ich was schreiben um Deine Behauptung zu beweisen, der ich ja nicht Folge, folglich auch schlecht ein Beweisprogramm dafür schreiben kann!? Netter Versuch…
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 19:23
von Alfons Mittelmeyer
OK, wenn Ihr unbedingt den Beweis haben wollt, dann bekommt ihr ihn in Kürze.
Re: 'command' zwei Argumente übergeben?
Verfasst: Montag 10. August 2015, 19:55
von jens
@Alfons Mittelmeyer: Schau dir einfach mal existierende GUI Editoren an. z.B.:
https://github.com/alejandroautalan/pygubu
Da wird sogar
del verwendet:
https://github.com/alejandroautalan/pyg ... =%E2%9C%93