Guten Abend,
mein Programm ist der Versucht eine Simulation eines elastischen Stoßes im idealen Gas mit Python nachzustellen. Das heißt, es besteht im Wesentlichen aus einer Klasse, welche eine Kugel mit den grundlegendsten Eigenschaften der Physik (Masse, Geschwindigkeit, Stoßlogik, usw.) ausstattet. An und für sich ist das auch nicht allzu schwierig, da ich keine großen Formeln aufstellte sondern den Computer einfach ständig kontrollieren lasse ob ein Stoß ausgeführt werden muss oder nicht. Dadurch entstehen natürlich Fehler, aber diese sind nicht das Problem, da diese ja durch meine Programmlogik "vorprogrammiert" sind.
Das Problem ist eher, das meine CPU-Auslastung schon ab drei Kugeln bei ca. 100% liegt.
Mein PC hat 2,4 Ghz, was bei weitem genug sein müsste und ich verwende Python 2.5 mit Tkinter unter Linux.
Bitte nicht über meine Namensgebung beschweren, ich weiß, dass sie nicht allzu gut ist. Vor allem da ich die Vektoren einfach mit Buchstaben Abgekürzt habe (so heißt zum Beispiel sM_bM(Vektor von self Mitte nach bullet Mitte) und _n(Normalvektor)). Da mir gerade aber keine gute Schreibweiße eingefällt, habe ich diesen Mangel noch nicht beseitigt. (Die Formel sollte aber so und so nicht der Problem sein!)
Irgendwelche Ideen welche das CPU Problem beseitigen könnten?
Verbesserungsvorschläge sind natürlich willkommen =), bin noch recht ein Anfänger =/.
Code: http://paste.pocoo.org/show/113621/
mfg smashed
performance problem
Hoi,
schönes Programm. Kann man durchaus vereinfachen (statt sympys evalf() aufzurufen kannst Du z. B. direkt mit numpy arbeiten, was schneller wäre -- sympy arbeitet ja auch mit numpy ist allerdings ein Layer drauf), müßte etwas aufgeräumt werden (was machen das 'global' da und was ist mit centralImpulse()?) und noch einige weitere Kleinigkeiten, aber daran will ich nicht weiter kritteln.
Zu Deiner Frage: Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist (jedenfalls bei Einfachkernen, bei Mehrfachkernen ist dann eben der eine wo es gerade drauf läuft entsprechend ausgelastet). Das ist doch nicht schlimm, oder? Wenn Du das Programm optimierst, wird die Simulation schneller laufen, aber die CPU-Auslastung ändert sich nicht. Ggf. wird die Simulation so schnell, dass Du sie künstlich bremsen mußt, weil Deine Augen, den Punkten sonst nicht folgen können .
Gruß,
Christian
schönes Programm. Kann man durchaus vereinfachen (statt sympys evalf() aufzurufen kannst Du z. B. direkt mit numpy arbeiten, was schneller wäre -- sympy arbeitet ja auch mit numpy ist allerdings ein Layer drauf), müßte etwas aufgeräumt werden (was machen das 'global' da und was ist mit centralImpulse()?) und noch einige weitere Kleinigkeiten, aber daran will ich nicht weiter kritteln.
Zu Deiner Frage: Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist (jedenfalls bei Einfachkernen, bei Mehrfachkernen ist dann eben der eine wo es gerade drauf läuft entsprechend ausgelastet). Das ist doch nicht schlimm, oder? Wenn Du das Programm optimierst, wird die Simulation schneller laufen, aber die CPU-Auslastung ändert sich nicht. Ggf. wird die Simulation so schnell, dass Du sie künstlich bremsen mußt, weil Deine Augen, den Punkten sonst nicht folgen können .
Gruß,
Christian
Nach kurzem Überfliegen:
Die Logik Deines Programmablaufes ist
prinzipiell falsch (äh, ziemlich ungünstig...).
Du sagst in der Berechnungsschleife
(in Pseudocode):
Stattdessen sollte es sein:
canvas.update() und canvas.after() sollten nicht
von den Bullets aufgerufen werden.
Schau Dir mal mein Beispiel
http://paste.pocoo.org/show/91141/
(verwendet keine mainloop!)
aus dem Thread
http://www.python-forum.de/post-116169.html#116169
an.
Mit dieser Logik sollte es wesentlich
schneller laufen.
yipyip
Die Logik Deines Programmablaufes ist
prinzipiell falsch (äh, ziemlich ungünstig...).
Du sagst in der Berechnungsschleife
(in Pseudocode):
Code: Alles auswählen
fuer alle bullets:
berechne bullet und
zeichne immer wieder neu
mit individuellem canvas.update() und
canvas.after()
Code: Alles auswählen
solange kein programmabbruch:
fuer alle bullets:
berechne(bullet)
zeichne(bullet)
(nur einmal!)
canvas.update()
von den Bullets aufgerufen werden.
Schau Dir mal mein Beispiel
http://paste.pocoo.org/show/91141/
(verwendet keine mainloop!)
aus dem Thread
http://www.python-forum.de/post-116169.html#116169
an.
Mit dieser Logik sollte es wesentlich
schneller laufen.
yipyip
-
- User
- Beiträge: 38
- Registriert: Samstag 24. November 2007, 16:50
Nach meinem Verständnis brauche ich kein time.sleep() in meinem Code, da ich ja after() verwende und mir somit auch gleich sämtliche Threads erspare, welche man so oder so nicht gut mit Tkinter kombinieren kann. Hab ich die Methode grundsätzlich falsch verstanden oO ?CM hat geschrieben:Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist
@ yipyip: danke für den Tipp und das Beispiel, hört sich soweit logisch an.
Und.. Ist iPython wirklich schneller?
mfg
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Solang wir von demselben ipython reden, ist es nur eine - massiv - aufgebohrte interaktive Shell. darum wird sie allenfalls genauso schnell, wenn nicht langsamer sein, aber um Code laufen zu lassen ist das irrelevant.smashed to pieces hat geschrieben:Und.. Ist iPython wirklich schneller?
Nein, keine Sorge. Was ist meine ist lediglich, dass man mit time.sleep() lediglich provozieren kann, dass der Prozessor ein Nickerchen machen kann, er ansonsten bei Deinem Programm arbeiten wird. Mit Tkinter kenne ich mich nicht aus - aber was yipyip sagt, kann ich nur unterstreichen.smashed to pieces hat geschrieben:Nach meinem Verständnis brauche ich kein time.sleep() in meinem Code, da ich ja after() verwende und mir somit auch gleich sämtliche Threads erspare, welche man so oder so nicht gut mit Tkinter kombinieren kann. Hab ich die Methode grundsätzlich falsch verstanden oO ?CM hat geschrieben:Im Code steht nicht, dass der Rechner das Rechnen bleiben lassen soll. M.a.W. kein time.sleep() oder so. Der Rechner ist 100% beschäftigt und das wird er immer mit so einem Programm sein - egal wie leistungsfähig die CPU ist
Und was ipython angeht: Wie kommst Du darauf? Hat das wer behauptet?
Gruß,
Christian