Jump to content

Python Programm schneller bekommen


Recommended Posts

Hallo,

Ich hab das Forum schon durchsucht und nichts gefunden.

 

Ich verwende einen Red Brick, eine Power Supply, zwei Master 2.0, 1 solid Stare relais und 7 PTC-bricklets 2.0.

 

Mein Problem ist, dass der TinkerForge Red Brick mit meinem Python Programm überfordert ist. Die CPU ist immer zu 100% ausgelastet und die Temperaturen werden zeitverzögert ausgelesen. Hat jemand eine Idee, wie ich das Python Programm schneller bekomme, bspw. Als stand alone. Ich habe schon Versucht eine stand alone Python Programm hochzuladen und zu starten, aber es ließ sich auf dem TinkerForge nicht starten, auf meinem Linux PC jedoch schon. Als stand alone hätte ich natürlich auch keinen Zugriff mehr über den brickviewer auf das Programm. Habe es auch Versucht mit alternativen Compilern, aber alle auf dem TinkerForge nicht zum laufen bekommen.

 

Ich hoffe jemand kann mir helfen, vielen Dank schon mal im voraus.

 

Conan der Barbar

Link to post
Share on other sites

Okay, dann kannst du dein Programm mit einem Profiler betrachten, um zu sehen wo das Programm seine Zeit verbringt:

 

https://docs.python.org/3.7/library/profile.html

 

Das erste wo nach ich im Code schauen würde, ist ob du Schleifen hast, die irgendetwas viel häufiger tun als sie müssten:

 

Nach diesem Muster z.B.:

 

while True:
    ptc_bricklet.get_temperature()

 

Der Code fragt mit voller Geschwindigkeit die Temperatur ab, mehrere tausende male pro Sekunde. So schnell ändert sich die Temperatur aber nicht. Es würde auch vollständig reichen die Temperatur nur jede Sekunden anzufragen:

 

while True:
    ptc_bricklet.get_temperature()
    time.sleep(1)

 

Das spart enorm CPU Last.

Link to post
Share on other sites

Hallo,

 

ich habe keine schleifen drinne, genau wegen so etwas wie du es eben beschrieben hast.

 

ich frage die temperatur regelmäßig ab, mit der callbackfunktion von TF. Auch auf sleep verzichte ich, da die programmoberfläche dann ins stocken kommt. Andere Werte von denen ich regelmäsig ein update brauche hohle ich mir mit eine selbst gebastelten callbackfunktion mit QTimer von PyQT5.

 

Bei den Temperaturwerten ist es so, dass das kleinste Zeitintervall in dem ich die 7 Werte nacheinander abfragen kann, 30 sekunden ist, da ansonsten der alte Wert mit einem Neuen überschrieben wird, bevor ich den alten abspeichern kann.

 

Das wäre auch noch erwähnenswert: Es gibt eine graphische Oberfläche mit PyQT5, und abspeichern tue ich die Werte in einer SQLite Datenbank.

 

Das vollständige Auslasten der CPU hat erst angefangen, als ich mein Programm um die SQLite Datenbank erweitert habe und ein regelmäßiges An- und Ausschalten des Solid State Relais programmiert habe.

 

Ich dachte zuerst es liegt an der SQLite-Datenbank, aber die ist ja gerade dafür konzipiert, auf einem System mit wenig Anspruch zu laufen und auch laut meinem Betreuer, kann es nicht daran liegen. Ich kann mir aber auch nicht vorstellen, dass es an dem Relais liegen kann, da das eigentlich nicht so viel macht, auser in in einem bestimmten Tackt an und aus zu gehen.

 

Aber in jedem Fall schonmal Danke dafür, dass du versuchst mir zu helfen. Ich weis echt nicht mehr weiter..

Link to post
Share on other sites

Okay, wenn du also schon weißt, dass es vor dem Hinzufügen von SQLite und dem Solid State Relay besser war, dann sollte es nicht so schwer sein das Problem zu finden.

 

Hast du deinen Code unter Versionskontrolle (git, svn, hg ...)? Sprich hast du noch eine alte Version deines Programs, bevor das Problem aufgetreten ist?

 

Dann teste diese alte Version jetzt noch mal, nur um sicher zu gehen, dass das Problem durch Änderungen an deinem Programm entstanden ist und nicht durch irgendetwas anderes was sich in der Zwischenzeit geändert hat. Wenn das Problem in deinem Programm ist, dann sollte die alte Version jetzt auch noch gut laufen.

 

Wenn eine alte Version des Programm besser läuft, dann muss es an etwas liegen, dass du in deinem Programm geändert hast.

 

Es mag an SQLite liegen, auch wenn dein Betreuer das für unwahrscheinlich hält. Solange du nicht beweisen kannst, dass SQLite nicht das Problem ist, solltest du das nicht einfach so ausschließen. Es man nicht SQLite im allgemeinen sein, aber vielleicht verwendest du SQLite in einer ungünstigen Weise.

 

Das kannst du testen in dem du in deinem Programm den SQLite Teil mal totlegst, bzw. den Solid State Relay Teil.

 

Damit solltest du herausfinden können wo das Problem entsteht. Du baust im Prinzip eine alte schnelle Version des Programms Schritt für Schritt auf die aktuelle langsame Version um und testet nach jedem Schritt. Auf dem Weg solltest du das Problem finden.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...