Startzeit zu lang

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich habe ein kleines Python programm geschrieben, das man mit ein paar argumenten startet (z.b. "python programm.py 00 ff 02 33"). Die argumente werden im Programm in ein einen String geschrieben und an die UART Schnittstelle geschickt.

    Das Programm an sich läuft auch sehr schnell, mein Problem ist nur, dass die Startzeit sehr lang ist, ca. 0,8 Sekunden braucht das programm vom aufrufen bis zum ausführen.

    Was ich schon rausgefunden habe ist, dass es wohl an den Imports liegt. Ohne die Imports geht es sehr schnell (wenn ich die Argumente hart in den Code schreibe und das programm aufrufe, geht es in ca 0,2 sekunden).

    Hat jemand eine Idee, wie ich das Programm "schneller" bekomme?
    Da ich das Programm für die Hausautomatisierung nutze, möchte ich es möglichst schnell haben, damit z.B. das Licht schneller angeht, nachdem ich auf den Button gedrückt habe :)

    liebe Grüße :)

    • Offizieller Beitrag
    Zitat

    . Ohne die Imports geht es sehr schnell (wenn ich die Argumente hart in den Code schreibe und das programm aufrufe, geht es in ca 0,2 sekunden).

    Imports oder Argumente?

    Und zeig doch mal deinen Code

  • Na wenn das script (fast) nichts oder weniger tun muss, läuft es logischerweise schneller.
    Eine gewisse Latenzzeit wirst Du nicht vermeiden können, da der Python-Interpreter erst geladen werden muss (das ist der Nachteil von Interpreter-Sprachen).

    cu,
    -ds-

  • mehr ists nicht :)
    Die Argumente sind HEX werte, die an die Schnittstelle gesendet werden.

    habs getestet, eine .pyc ist auch nicht schneller... (bin nicht so der python pro :P )


    Gibt es überhaupt eine theoretische möglichkeit, es irgendwie schneller zu bekommen, oder ists besser das programm dauernt laufen zu lassen und die HEX werte über einen Socket an das programm zu übergeben? dann würde das programm nicht für jeden Befehl gestartet werden müssen.


  • ...
    ... habs getestet, eine .pyc ist auch nicht schneller... (bin nicht so der python pro :P )
    ...


    wundert mich nicht ... ich denke, das ist Bytecode wie Java und keine echte Object-Datei ;) ... um einen Zeitvergleich zu machen ist der script imho zu kurz



    ...
    ... besser das programm dauernt laufen zu lassen
    ...

    naja ... bei 0.8 Sekunden Verzögerung bis das Licht angeht ... ob da der Aufwand lohnt?
    cu,
    -ds-

    • Offizieller Beitrag

    Zuerst solltest du den Serielle Verbindung auch wieder schliessen bevor du das script beendest. Warum importierst du argparse wenn du es nicht nutzt? Das sys exit kann auch weg. Er beendet sich ja automatisch wenn das Script abgearbeitet ist.

    Wie rufst du die das Script auf. Ich hätt gern mal ein beispiel und es zu testen

  • Hm also abgesehen von dem was dbv schon erwähnte, würde ich auch noch empfehlen wirklich nur die Funktionen zu importieren die du wirklich brauchst - einfach alles zu importieren benötigt immer länger. So wäre zum Beispiel "import serial" langsamer als wenn man "from serial import Serial" verwenden würde ;)

    Auch kann es ein paar Nanosekunden (bei größeren Projekten sogar Milli- bis Sekunden) Unterschied ausmachen ob man " oder ' verwendet.

    - Also generell solltest du nur das importieren was du brauchst... sys und argparse wird bei dir gar nicht verwendet bzw benötigt.
    - Dann versteh ich nicht ganz was die ganze Umwandelrei " chr(int(arg,16)) " bewirken soll :huh: Doppeltgemoppelt hält besser? :D
    - Evtl. bremst auch das öffnen des Seriellen Ports etwas aus, da kann man nämlich auch noch etwas einstellen..
    - Auch kann python3 das ganze noch mals beschleunigen, allerdings hat sich da einiges geändert und du müsstest pyserial auch explizit für python3 installieren..

    Man kann relativ einfach eine benötigte 'elapsed time' analysieren:
    1. Entweder direkt im Python Script - setzt allerdings vorheriges importieren von "time" voraus.
    2. Oder über die Konsole, vor und nach dem Befehl.

    Dabei wird in jedem Fall am Anfang die sog. Unixtime gespeichert und am Ende wird die Startzeit von der Endzeit abgezogen (end - start = duration) ... die Differenz ist dann die benötigte Zeit.


    Aber kümmern wir uns erst mal ums optimieren deines Python Scripts:

    Ich würde dir aber folgendes empfehlen:

    Spoiler anzeigen

    Um dies jetzt der Einfachkeit halber nach der 2. Möglichkeit zu prüfen wie lange es zum ausführen benötigt, macht man einfach folgendes:

    Code
    S=$(date +%s); python programm.py; echo duration: $(( $(date +%s) - $S ))sec


    Das gibt aber eben nur aus wie lange es benötigt um ausgeführt zu werden..

    Die Erste Möglichkeit sähe wie folgt aus:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!