Domanda

Ho una domanda scritta in Python e "compilato" con Pyinstaller. Utilizza anche PYQT per il framework GUI.

L'esecuzione di questa applicazione ha un ritardo di circa 10 secondi prima che la finestra principale si carichi e viene mostrata. Per quanto ne so, ciò non è dovuto alla lentezza nel mio codice. Invece, sospetto che ciò sia dovuto all'inizializzazione di Python Runtime.

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

Ho accesso alla fonte per il caricatore di Pyinstaller Win32, il codice Python e persino il codice di avvio.

Le mie domande sono:

  • Come posso far iniziare questa applicazione più velocemente?

  • Come posso misurare il tempo di passare il tempo i primi secondi della vita del processo?

  • Qual è la tecnica generalmente accettata per ridurre il tempo fino a quando non viene mostrata la prima finestra?

Vorrei evitare di aggiungere una schermata di splash per due motivi: uno, mi aspetto che non mi aiuterà (il sovraccarico è prima che il codice Python funzionasse) e due, non mi piacciono gli schermi splash :)

Se ho bisogno, potrei probabilmente modificare lo stub del caricatore Pyinstaller per creare una finestra, ma questo è un altro percorso che preferirei non prendere.

È stato utile?

Soluzione

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 una rete o qualche chiamata di risorsa I/O che tiene la tua app?
  • Hai provato un'altra macchina della tua? Anche l'hardware più veloce può essere lento a volte con la configurazione del software, le app o il sistema operativo errati, provalo.
  • Prova a cronometrare con il modulo timeit.

Non ho mai usato Pyqt, ma con Wxpython la velocità di avvio è OK, e dopo la prima inizializzazione se chiudo e apro di nuovo, è più veloce della prima volta.

Altri suggerimenti

Di 'a Pyinstaller di creare un eseguibile in modalità console. Questo ti dà una console di lavoro che puoi utilizzare per il debug.

Nella parte superiore dello script principale, anche prima che venga eseguita la prima importazione, aggiungi un "codice Python di avvio" di stampa. Quindi eseguire l'eseguibile confezionato dalla riga di comando. In questo modo puoi ottenere un'immagine chiara se il tempo viene trascorso nel bootloader di Pyinstaller o nella tua applicazione.

Il bootloader di Pyinstaller è di solito abbastanza veloce in modalità One-DIR, ma può essere molto più lento in modalità 1-file, perché deprack tutto in una directory temporanea. Su Windows, I/O è molto lento e quindi hai antivirus che vorranno ricontrollare tutti quei file DLL.

Pyqt stesso non è un problema. Pyqt è generato da SIP che genera legami pigri molto veloci; L'importazione dell'intero PYQT è più veloce di qualsiasi altra libreria GUI perché fondamentalmente non fa nulla: tutti i binding a classi/funzioni vengono creati dinamicamente quando (e se!) Li accedi, salvando anche molta memoria.

Se la tua applicazione è lenta a venire, questo sarà vero anche senza Pyinstaller. In tal caso, la tua unica soluzione è una schermata splash (importa solo pyqt, crea Qapplication, crea un display lo splashscreen, quindi importa il resto del programma ed eseguilo) o rielabora il tuo codice. Non posso aiutarti molto senza dettagli.

Sospetto che tu stia usando la modalità "One File" di Pyinstaller - questa modalità significa che deve disimballare tutte le librerie in una directory temporanea prima che l'app possa iniziare. Nel caso di QT, queste librerie sono piuttosto grandi e impiegano alcuni secondi per decomprimere. Prova a usare la modalità "One Directory" e vedi se questo aiuta?

Sono d'accordo con le risposte sopra. Il mio programma QT Python aveva bisogno di circa 5 secondi per avviarsi su un PC decente quando si utilizza una modalità FILE. Dopo aver cambio in -Eonedir, per iniziare solo circa un secondo; Quasi immediatamente dopo che l'utente ha fatto doppio clic sul file EXE. Ma lo svantaggio è che ci sono molti file in quella directory che non è così pulito.

Per la mia applicazione, il lungo tempo di avvio è stato quasi interamente causato dal sistema antivirus. Spegnendolo ridotto l'avvio nel mio caso da 3 minuti a meno di 10 secondi!

Per portare queste misurazioni in prospettiva: la mia applicazione è stata in bundle con file di dati extra (circa 150 file con un carico utile di 250 MB), oltre a portare in giro QT e Numpy (che può dipendere da Intel MKL, che da solo aggiunge un altro 200 MB al pacchetto!) dipendenze. Non ha nemmeno aiutato molto che il sistema testato fosse in esecuzione con un'unità a stato solido ...

In conclusione: se hai una grande applicazione con molte dipendenze, il tempo di avvio può essere fortemente influenzato dal sistema antivirus!

Nel caso in cui qualcuno abbia ancora questo problema, ho risolto il mio eseguendo l'EXE a livello locale e non su alcuna sharedrives. Ciò ha richiesto il tempo di avvio da oltre un minuto a meno di 10 secondi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top