2012-02-27 84 views
18

Tôi có một ứng dụng được viết bằng Python và 'biên dịch' với PyInstaller. Nó cũng sử dụng PyQt cho khung công tác GUI.Windows: Khởi động ứng dụng chậm

Chạy ứng dụng này có độ trễ khoảng 10 giây trước khi cửa sổ chính tải và được hiển thị. Theo như tôi có thể nói, điều này không phải do sự chậm chạp trong mã của tôi. Thay vào đó, tôi nghi ngờ điều này là do khởi chạy thời gian chạy Python.

Sự cố là ứng dụng này được bắt đầu bằng ứng dụng laucncher/thanh tác vụ tùy chỉnh. Người dùng sẽ nhấp vào nút để khởi chạy ứng dụng, không thấy có gì xuất hiện và nhấp vào nơi khác trên ứng dụng khác. Khi ứng dụng của tôi hiển thị cửa sổ của nó, nó không thể đến nền trước do các quy tắc cho SetForegroundWindow.

Tôi có quyền truy cập vào nguồn cho trình tải win32 của PyInstaller, mã Python và thậm chí cả mã trình khởi chạy.

Câu hỏi của tôi là:

  • Làm thế nào tôi có thể làm cho ứng dụng này bắt đầu nhanh hơn?

  • Làm cách nào để tôi có thể đo lường thời gian dành cho tôi trong vài giây đầu tiên trong suốt thời gian của quá trình?

  • Kỹ thuật được chấp nhận chung để giảm thời gian cho đến khi cửa sổ đầu tiên được hiển thị là gì?

Tôi muốn tránh thêm màn hình giật vì hai lý do - một, tôi hy vọng nó sẽ không giúp ích (chi phí trước khi mã Python chạy) và hai, tôi không thích màn hình giật gân :)

Nếu cần, tôi có thể chỉnh sửa trình tải nạp PyInstaller để tạo cửa sổ, nhưng đó là một tuyến đường khác mà tôi không muốn dùng.

Cảm ơn các đề xuất.

Trả lời

1

Tôi đã 'biên soạn' một vài ứng dụng wxPython bằng py2exe và cx_Freeze, Không ai trong số họ mất hơn 4 giây để bắt đầu.

  • Bạn có chắc chắn đó không phải là mã của bạn? có thể một số mạng hoặc một số cuộc gọi tài nguyên I/O đang giữ ứng dụng của bạn?
  • Bạn đã thử máy khác với máy của mình chưa? Ngay cả phần cứng nhanh nhất có thể chậm đôi khi với cấu hình phần mềm sai, ứng dụng hoặc hệ điều hành, hãy thử.
  • Hãy thử định thời gian với mô-đun timeit.

Tôi chưa bao giờ sử dụng pyQT, nhưng với wxPython tốc độ khởi động là OK và sau lần khởi chạy đầu tiên nếu tôi đóng và mở lại, nó nhanh hơn lần đầu tiên.

8

Tôi nghi ngờ rằng bạn đang sử dụng chế độ "một tệp" của pyinstaller - chế độ này có nghĩa là nó phải giải nén tất cả các thư viện vào một thư mục tạm thời trước khi ứng dụng có thể bắt đầu. Trong trường hợp của Qt, các thư viện này khá lớn và mất vài giây để giải nén. Hãy thử sử dụng chế độ "một thư mục" và xem điều đó có hữu ích không?

10

Yêu cầu PyInstaller tạo chế độ bảng điều khiển thực thi. Điều này cung cấp cho bạn một bàn điều khiển làm việc mà bạn có thể sử dụng để gỡ lỗi.

Ở đầu tập lệnh chính của bạn, ngay cả trước khi lần nhập đầu tiên được chạy, hãy thêm bản in "Bắt đầu mã Python". Sau đó chạy tệp thực thi được đóng gói của bạn từ dòng lệnh. Bằng cách này bạn có thể có được một bức tranh rõ ràng cho dù thời gian được chi tiêu trong bộ nạp khởi động của PyInstaller hay trong ứng dụng của bạn.

Trình tải khởi động của PyInstaller thường khá nhanh ở chế độ một-dir, nhưng nó có thể chậm hơn nhiều ở chế độ một tệp, vì nó sẽ nạp mọi thứ vào một thư mục tạm thời. Trên Windows, I/O là rất chậm, và sau đó bạn có antiviruses mà sẽ muốn kiểm tra lại tất cả những tập tin DLL.

PyQt chính nó không phải là vấn đề. PyQt được tạo ra bởi SIP tạo ra các ràng buộc lười biếng rất nhanh; import toàn bộ PyQt nhanh hơn bất kỳ thư viện GUI nào khác vì nó về cơ bản không có gì: tất cả các ràng buộc vào các lớp/hàm được tạo động khi (và nếu!) bạn truy cập chúng, cũng tiết kiệm rất nhiều bộ nhớ.

Nếu ứng dụng của bạn chậm đi, điều đó cũng đúng nếu không có PyInstaller. Trong trường hợp đó, giải pháp duy nhất của bạn là màn hình giật gân (chỉ nhập PyQt, tạo QApplication, tạo hiển thị màn hình splash, sau đó nhập phần còn lại của chương trình và chạy nó) hoặc làm lại mã của bạn. Tôi không thể giúp bạn nhiều mà không có chi tiết.

+0

Bạn đã đúng, tôi đã tạo một ứng dụng đơn giản và thực sự là thời gian khởi động đã gần như ngay lập tức. Tôi đang sử dụng chế độ onedir. Tôi tin rằng vấn đề là một số hàng nhập khẩu của tôi. Tôi có nhiều theo dõi hơn để làm. –

+0

Rất tiếc, cảm ơn bạn đã đọc mẹo về chống vi-rút. Khi tôi vô hiệu hóa AV của mình, exe của tôi đã tăng tốc. – iridescent

1

Tôi đồng ý với câu trả lời ở trên. Chương trình python Qt của tôi cần khoảng 5 giây để khởi động trên một PC phong nha khi sử dụng chế độ onefile. Sau khi tôi đổi thành --onedir, nó chỉ mất khoảng một giây để bắt đầu; gần như ngay lập tức sau khi người dùng nhấp đúp vào tệp exe. Nhưng nhược điểm là có rất nhiều tập tin trong thư mục đó không phải là quá gọn gàng.

Các vấn đề liên quan