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.
GUI-Fenster öffnet stark verzögert
-
- 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.
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.
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.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Habe nun alles geändert und nur noch das Notwendigste importiert. Leider keine signifikante Verbesserung.__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.
Ö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.
@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.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Ich wandle die ui-Datei zunächst in eine Python-Datei. Also sollte es ja daran nicht liegen.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.
@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: 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?
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Da kann ich ja vermutlich den Profiler bemühen wie ich will. Das Problem liegt davor.Patrick1990 hat geschrieben: Öffne ich die GUI aus Spyder heraus, kommt das Fenster sofort.
Der Aufruf über die Batch-Datei dauert hingegen 10s.
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.
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.
@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.
Verstehe mich nicht falsch. Ich lade die *.ui-Datei auch dynmaisch.
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.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Habe jetzt mal gemessen mit dem time-Modul an folgender Stelle:
Ö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.
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 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.
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.
Das ist aber noch ein gewaltiger Unterschied zu 10s vom Anfang.
-
- User
- Beiträge: 116
- Registriert: Freitag 3. Juni 2016, 05:45
Ja, vermutlich durch die Änderung, dass nur noch benötigte Funktionen geladen werden.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.
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.