GUI-Fenster öffnet stark verzögert

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Hallo,

und wieder habe ich eine Frage.
Ich öffne die GUIs mit einer Windows Batch-Datei, welche das erforderliche Python-File startet.
Bei einigen der GUIs dauert es etwa 10s bis die Fenster sich öffnen. Woran kann das liegen? Die Dateigrößen sond um die 70 KB.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Patrick1990: wenn es von der GUI abhängt, wird es wohl irgendwas sein, was Du im Pythonprogramm so machst.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Es ist einzig das Öffnen von einem Fenster und das Setzen von Initialwerten und ein paar Einstellungen. Nichts gravierendes was Berechnungen erfordern würde.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Qt und PyQt sind sehr grosse Projekte. Wenn du da wild importierst etc. dann kann es einfach lange dauern, bis die ganzen shared libraries etc. geladen sind. Da koennte man mit profiling drauf schaun & versuchen zu optimieren.

Wenn das nicht schneller zu bekommen ist, musst du deinen Ansatz in Frage stellen. Warum musst du mehrere GUIs haben, reicht nicht eine, die dann mit Daten gefuettert wird zB.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

__deets__ hat geschrieben:Qt und PyQt sind sehr grosse Projekte. Wenn du da wild importierst etc. dann kann es einfach lange dauern, bis die ganzen shared libraries etc. geladen sind. Da koennte man mit profiling drauf schaun & versuchen zu optimieren.

Wenn das nicht schneller zu bekommen ist, musst du deinen Ansatz in Frage stellen. Warum musst du mehrere GUIs haben, reicht nicht eine, die dann mit Daten gefuettert wird zB.
Habe nun alles geändert und nur noch das Notwendigste importiert. Leider keine signifikante Verbesserung.
Öffne ich die GUI aus Spyder heraus, kommt das Fenster sofort.

Der Aufruf über die Batch-Datei dauert hingegen 10s.


Es sind mehrere GUIs, da diese für unterschiedliche Programme sind.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Lässt Spider immer die gleiche Interpreter-Instanz laufen? Oder wir der jedes Mal neu gestartet? Sonst hab ich erstmal keine Erklärungen mehr.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Patrick1990 Lädst du die GUI dynamisch oder als Python-Datei? Mit PyQt hat man mehrere Möglichkeiten, die Fenster zu öffnen. Entweder man erstellt mittels QDesigner eine *.ui-Datei und lädt diese direkt und dynamisch oder aber man lässt die *.ui-Datei zunächst in eine Python-Datei konvertieren. Diese Variante hat den Nachteil, dass immer ein Zwischenschritt erforderlich ist, hat aber den Vorteil, dass die GUIs auf diese Weise schneller geladen werden.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Sophus hat geschrieben:@Patrick1990 Lädst du die GUI dynamisch oder als Python-Datei? Mit PyQt hat man mehrere Möglichkeiten, die Fenster zu öffnen. Entweder man erstellt mittels QDesigner eine *.ui-Datei und lädt diese direkt und dynamisch oder aber man lässt die *.ui-Datei zunächst in eine Python-Datei konvertieren. Diese Variante hat den Nachteil, dass immer ein Zwischenschritt erforderlich ist, hat aber den Vorteil, dass die GUIs auf diese Weise schneller geladen werden.
Ich wandle die ui-Datei zunächst in eine Python-Datei. Also sollte es ja daran nicht liegen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: hast Du das mal geprofiled?

@Patrick1990: man wandelt keine ui-Dateien in py-Dateien um, weil das nur alles komplizierter macht und keinen Vorteil bringt. Hast Du Dein Programm mal geprofiled um zu sehen, wo die Zeit verbraucht wird?
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Patrick1990 hat geschrieben: Öffne ich die GUI aus Spyder heraus, kommt das Fenster sofort.

Der Aufruf über die Batch-Datei dauert hingegen 10s.
Da kann ich ja vermutlich den Profiler bemühen wie ich will. Das Problem liegt davor.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jein. Wenn irgendwas in der batchdatei vorher lange dauert, klar. Aber so wie du das zumindest beschreibst setzt die batch-Datei ja das Startkommando ab, und *dann* dauert es eeeeewig. Ich habe zwar keine Ahnung was dann da passiert, aber das kann man ggf. schon profilen.

Anfangen wuerde ich aber erstmal mit einem einfachen nicht-gui-hallo-welt Skript das einfach mal abprueft, ob das Kommando aufzurufen selbst schon so lange dauert (weil das OS aus voellig unerfindlichen Gruenden einen Meldereiter losschickt, um den Python Interpreter zu finden), oder ob es dann im hochziehen der Anwendung begruendet ist.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirus3: geprofiled? Du meinst, ob ich die Zeit gemessen habe? Aber abseits der Messung. Ist es nicht "logisch", dass eine Python-GUI-Datei wesentlich schneller ist, als wenn man die *ui-Datei dynamisch lädt? Ich meine, bei der Umwandlung reden wir ja von ein sogenanntes statisches Modul - erzeugt vom pyuic-Werkzeug. Hierbei wird nur einmal die Kompilierungsstufe ausführt, während uic es jedes Mal erneut tun muss. Konkret: PyQt muss ja zunächst einmal die *.ui-Datei (die im Grunde eine XML-Datei ist) analysieren und anschließend das Ergebnise in den PyQt-Quelltext umwandeln - und das wird jedes Mal erneut getan, wenn das Programm ausgeführt wird. Mit dem statischen Modul wird das XML-Parsen und die Konvertierung nur einmal zur Kompilierzeit durchgeführt. Danach muss das Programm nur noch das kompilierte Modul importieren.

Verstehe mich nicht falsch. Ich lade die *.ui-Datei auch dynmaisch.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Schlüssel hier ist “wesentlich”. Und die Antwort ist nein. Auch Python muss geparst werden. Und ausgeführt. Wenn das doppelt so schnell ist, oder wegen mir 5mal, dann ist das der Unterschied zwischen einer 10tel und einer halben Sekunde. Beides irrelevant. Die lange Ladezeit muss an was anderem hängen.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Habe jetzt mal gemessen mit dem time-Modul an folgender Stelle:

Code: Alles auswählen

def main():
    time_1=time()
    app = QtWidgets.QApplication(sys.argv)   
    gui = MainWindow()                                   
    gui.show()                                                               
    time_2=time()
    print("MDK:"+str(time_2-time_1)) 
    app.exec_() 
Öffnen der ui-Datei: ca. 1,45s
Öffnen der py-Datei (umgewandelte ui-Datei): ca. gleich mit dem Öffnen der ui-Datei (1,4s)

Öffnen mit Batch-Datei (2,8s)

Mit Stoppuhr am Handy messe ich überall ca. die doppelte Zeit.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Somit ist das Benutzen von ui-Dateien nicht signifikant langsamer. 1,4s zum Erzeugen einer GUI hört sich für mich plausibel an, wo die anderen 1,4s hingehen? Wahrscheinlich ins laden der Bibliotheken.

Das ist aber noch ein gewaltiger Unterschied zu 10s vom Anfang.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Sirius3 hat geschrieben: Dienstag 22. Mai 2018, 10:47 Somit ist das Benutzen von ui-Dateien nicht signifikant langsamer. 1,4s zum Erzeugen einer GUI hört sich für mich plausibel an, wo die anderen 1,4s hingehen? Wahrscheinlich ins laden der Bibliotheken.

Das ist aber noch ein gewaltiger Unterschied zu 10s vom Anfang.
Ja, vermutlich durch die Änderung, dass nur noch benötigte Funktionen geladen werden.
Ich habe jetzt nochmal mit einem Tool genauer geschaut.
Einen Großteil der Zeit benötigt die __init__-Funktion.
Bei einer der GUIs habe ich währenddessen noch eine Excel-Datei ausgelesen und einen Plot davon angefertigt. Das hat auch sehr lange gedauert.
Das Öffnen durch die Batch-Datei ist zwar immernoch etwas langsamer, jedoch komme ich mit dem Tool schon zu brauchbaren Ergebnissen.
Antworten