2012-02-27 10 views
18

Ho un'applicazione scritta in Python e "compilata" con PyInstaller. Utilizza anche PyQt per il framework GUI.Windows: avvio lento dell'applicazione

L'esecuzione di questa applicazione ha un ritardo di circa 10 secondi prima che la finestra principale venga caricata e visualizzata. Per quanto posso dire, questo non è dovuto alla lentezza nel mio codice. Invece, sospetto che ciò sia dovuto all'inizializzazione del runtime di Python.

Il problema è che questa applicazione viene avviata con un'applicazione laucncher/barra delle applicazioni personalizzata. L'utente farà clic sul pulsante per avviare l'app, non vedere apparire nulla e fare clic altrove su un'altra applicazione. Quando la mia applicazione mostra che è finestra, non può arrivare in primo piano a causa delle regole di SetForegroundWindow.

Ho accesso all'origine per il loader win32 PyInstaller, il codice Python e persino il codice di avvio.

Le mie domande sono:

  • Come posso fare avviare l'applicazione più veloce?

  • Come posso misurare il tempo trascorso nei primi secondi della durata del processo?

  • Qual è la tecnica generalmente accettata per ridurre il tempo finché non viene visualizzata la prima finestra?

vorrei evitare di aggiungere uno splash screen per due motivi - uno, mi aspetto che non aiuterà (l'overhead è prima di codice Python viene eseguito) e due, io proprio non mi piace splash screen :)

Se necessario, potrei probabilmente modificare lo stub del loader PyInstaller per creare una finestra, ma questa è un'altra strada che preferirei non prendere.

Grazie per i suggerimenti.

risposta

1

Ho "compilato" alcune app wxPython usando py2exe e cx_Freeze, nessuno di loro richiede più di 4 secondi per iniziare.

  • Sei sicuro che non sia il tuo codice? forse qualche rete o qualche chiamata di risorse I/O che contiene la tua app?
  • Hai provato un'altra macchina della tua? Anche l'hardware più veloce può essere lento a volte con la configurazione software, le app o il sistema operativo errati, provalo.
  • Provare a crearlo con il modulo timeit.

non ho mai usato PyQt, ma con wxPython la velocità di avvio è ok, e dopo il primo inizializzo se chiudo e aperto di nuovo, è più veloce rispetto alla prima volta.

8

Sospetto che stiate usando la modalità "un file" di pyinstaller - questa modalità significa che deve decomprimere tutte le librerie in una directory temporanea prima che l'app possa essere avviata. Nel caso di Qt, queste librerie sono piuttosto grandi e impiegano qualche secondo per decomprimere. Prova ad usare la modalità "una directory" e vedi se questo aiuta?

10

Dire a PyInstaller di creare un eseguibile in modalità console. Questo ti dà una console di lavoro che puoi usare per il debug.

Nella parte superiore dello script principale, anche prima dell'esecuzione della prima importazione, aggiungere una stampa "Codice Python iniziale". Quindi esegui il tuo pacchetto eseguibile dalla riga di comando. In questo modo è possibile ottenere un'immagine chiara del tempo trascorso nel bootloader di PyInstaller o nella propria applicazione.

Il bootloader di PyInstaller è in genere abbastanza veloce in modalità one-dir, ma può essere molto più lento in modalità a un solo file, perché depone tutto in una directory temporanea. Su Windows, I/O è molto lento, e quindi hai antivirus che vorranno ricontrollare tutti i file DLL.

PyQt è di per sé un problema. PyQt è generato da SIP che genera binding pigri molto veloci; importare l'intero PyQt è più veloce di qualsiasi altra libreria della GUI perché in pratica non fa nulla: tutti i collegamenti a classi/funzioni vengono creati dinamicamente quando (e se!) vi si accede, risparmiando anche molta memoria.

Se la vostra applicazione è lenta in arrivo, ciò vale anche senza PyInstaller. In tal caso, l'unica soluzione è una schermata iniziale (importa solo PyQt, crea QApplication, crea una visualizzazione dello splashscreen, quindi importa il resto del programma ed eseguilo) o rielaborare il tuo codice. Non posso aiutarti molto senza dettagli.

+0

Avevi ragione, ho creato un'applicazione più semplice e infatti il ​​tempo di avvio è diventato quasi istantaneo. Sto usando la modalità onedir. Credo che il problema siano le mie numerose importazioni. Ho molto più tracciamento da fare. –

+0

Wow, grazie per il suggerimento sull'antivirus. Una volta disabilitato il mio AV, il mio exe ha accelerato. – iridescent

1

Sono d'accordo con le risposte di cui sopra. Il mio programma Qt python aveva bisogno di circa 5 secondi per avviarsi su un PC decente quando si utilizza la modalità onefile. Dopo essere passato a - onedir, ci sono voluti circa un secondo per iniziare; quasi immediatamente dopo che l'utente fa doppio clic sul file exe. Ma lo svantaggio è che ci sono molti file in quella directory che non è così pulito.