Để tăng tốc độ cho chương trình python của tôi, tôi có nên tạo ra một luồng riêng biệt hoặc một quy trình riêng để ghi nhật ký không? Chương trình của tôi sử dụng rất nhiều đăng nhập và tôi không chắc liệu luồng có phù hợp vì GIL hay không. Rất nhiều tài nguyên dường như cho thấy rằng nó sẽ là tốt cho I/O. Tôi nghĩ rằng đăng nhập là I/O nhưng tôi không chắc chắn những gì "nên được tốt" có nghĩa là đối với hầu hết các nguồn lực ra khỏi đó. Tôi chỉ cần tốc độ.Để tăng tốc độ cho chương trình python của tôi, tôi có nên tạo ra một luồng riêng biệt hoặc một quy trình riêng để ghi nhật ký không?
Trả lời
Trước khi bạn bắt đầu cố gắng tối ưu hóa một chương trình, có một số việc bạn nên làm.
Để bắt đầu, bạn nên tiểu sử các chương trình của mình. Bạn có thể ví dụ: sử dụng line_profiler.
Nếu nó chỉ ra rằng phần mềm của bạn dành một số lượng đáng kể thời gian đăng nhập, có hai lựa chọn dễ dàng.
- Đặt loglevel trong mã sản xuất để không có hoặc ít (er) thư được ghi lại. Vẫn còn một số chi phí bên trái, nhưng nó sẽ giảm nhiều.
- Sử dụng phương tiện cơ học (như
sed
hoặcgrep
) để hoàn toàn xóa cuộc gọi ghi nhật ký từ mã sản xuất. Nếu điều này không cải thiện tốc độ/thông lượng của chương trình của bạn, việc ghi nhật ký không phải là vấn đề.
Nếu không ai trong số đó phù hợp và ghi nhật ký là một phần đáng kể thời gian của chương trình, bạn có thể thử triển khai ghi nhật ký luồng hoặc quy trình.
Nếu bạn muốn sử dụng threading
để đăng nhập, bạn sẽ cần một danh sách và một khóa. Hàm được gọi từ luồng chính để ghi nhật ký lấy khóa, gắn thêm văn bản để đăng nhập vào danh sách và nhả khóa. Chủ đề thứ hai chờ khóa, lấy khóa, bật một vài mục từ danh sách, nhả khóa và ghi các mục vào một tập tin. Vì GIL đảm bảo rằng chỉ có một luồng tại một thời điểm đang chạy mã byte bytecode của Python, điều này sẽ làm giảm hiệu suất của chương trình của bạn một chút; một phần thời gian của nó được dùng để chạy bytecode từ luồng ghi.
Sử dụng multiprocessing
hơi khác một chút, bạn có thể muốn sử dụng ví dụ: a Queue
để gửi thông điệp ghi nhật ký từ quá trình chính đến quá trình ghi nhật ký. Quá trình đăng nhập lấy các mục từ Queue và ghi chúng vào đĩa. Điều này có nghĩa là thời gian viết hành động ghi vào đĩa được chi tiêu trong một chương trình khác. Nhưng có một số chi phí liên quan đến việc sử dụng Hàng đợi.
Bạn sẽ phải đo để xem phương pháp nào sử dụng ít thời gian hơn trong chương trình của bạn.
Tôi sẽ bởi những giả định:
- Bạn đã xác định rằng nó là khai thác gỗ của bạn cũng được bottlenecking chương trình của bạn.
- Bạn có lý do chính đáng tại sao bạn ghi nhật ký những gì bạn đang ghi nhật ký.
Tốc độ chậm được cho là rất có thể do xác nhận thành công hay thất bại từ hành động ghi nhật ký. Để tránh điều này "lệnh xếp hàng" làm cho các cuộc gọi đến một quá trình riêng biệt asynchonously và bỏ qua gọi lại. Điều này có thể sẽ tiêu tốn nhiều tài nguyên hơn, nhưng điều này sẽ làm giảm bớt tồn đọng trong chương trình chính của bạn. Nodejs xử lý tự nhiên này hoặc bạn có thể cuộn trình nghe python của riêng bạn. Vì đây sẽ là một quá trình riêng biệt. Bạn có thể chuyển hướng tính năng ghi nhật ký của các chương trình khác của bạn đến chương trình này. Bạn thậm chí có thể có một máy riêng để xử lý khối lượng công việc này.
- 1. Django: Tôi có nên bắt đầu một quá trình riêng biệt không?
- 2. Tôi muốn tạo một miền riêng cho hình ảnh
- 3. tạo luồng MJPEG của riêng tôi
- 4. Làm cách nào để tạo trình khởi tạo của riêng tôi cho một mô-đun?
- 5. Không tăng tốc trong chương trình đa luồng
- 6. Node.js/v8: Cách tạo ảnh chụp nhanh của riêng tôi để tăng tốc khởi động
- 7. Bắt đầu một quá trình riêng biệt
- 8. Là một newbie, tôi nên đi đâu nếu tôi muốn tạo một chương trình GUI nhỏ?
- 9. Làm cách nào để đo lường quy mô mã đa luồng của tôi (tăng tốc)?
- 10. Cập nhật một ObservableCollection trong một luồng riêng biệt
- 11. Hệ điều hành: trình lập biểu quy trình có chạy trong quy trình riêng lẻ
- 12. Tìm tất cả quy trình con của quy trình .NET của riêng tôi/tìm hiểu xem liệu một quy trình cụ thể có phải là con của riêng tôi không?
- 13. Một MediaPlayer có nên chạy trong chuỗi riêng biệt không?
- 14. Tôi có thể tắt tiêu đề nhật ký cho trình ghi nhật ký ruby không?
- 15. Ứng dụng xem riêng biệt cho nhật ký của ELMAH
- 16. Tôi có nên sử dụng một khung công tác hoặc viết MVC của riêng mình không?
- 17. chương trình của tôi giảm tốc độ âm nhạc xuống 50% nhưng chỉ trong một kênh
- 18. ghi đè cài đặt tốc độ của chuột. Tạo thuật toán tỷ lệ chuột của riêng tôi
- 19. Tôi có nên gọi [super superMethod] sau mã của riêng tôi hoặc trước mã không?
- 20. Cập nhật nhãn trong một nhân viên riêng biệt (Quy trình)
- 21. Tôi có nên đặt giao diện công khai trong một tệp riêng biệt không?
- 22. Làm thế nào để tăng tốc các chương trình WPF?
- 23. Tạo Iterator riêng của tôi
- 24. Tôi có nên sử dụng các mô hình riêng biệt cho tên miền và EF không?
- 25. Có thể chấp nhận tạo nhiều lớp trong một tệp .swift hay tôi nên tạo riêng một tệp .swift riêng biệt cho mỗi lớp?
- 26. C++ - Triển khai luồng của riêng tôi
- 27. Làm cách nào để tôi có thể cấu hình bộ nhớ của chương trình đa luồng bằng Python?
- 28. Có ai giúp tôi hiểu luồng cho chương trình của tôi không?
- 29. Chương trình Visual C++ của tôi có thể nghe đầu ra gỡ lỗi của riêng nó không?
- 30. Bower - tôi có nên tạo một kho lưu trữ riêng cho bower và để phát triển không?
Điều gì khiến bạn tin rằng việc ghi nhật ký là nút cổ chai? Nếu bạn chưa làm như vậy, bạn sẽ muốn lập hồ sơ chương trình của mình để xem phần lớn thời gian chờ xảy ra ở đâu. – MrName
@MrName Tôi chỉ muốn loại bỏ mọi mili giây đơn lẻ mà tôi có thể loại bỏ. Mã của tôi phải chạy 10 triệu lần và mỗi mili giây đếm. Hoặc bạn đang đề xuất 10m * 200 = 2b dòng đăng nhập không quan trọng đến mức đó? – user2675516
Tôi giả định rằng chi phí hiệu suất của các cuộc gọi đăng nhập của bạn sẽ phụ thuộc nhiều vào các trình xử lý ghi nhật ký. Luồng MIGHT giúp đỡ, nhưng nó có thể tốt hơn để chạy các loại điều này trong các tác vụ nền, do đó thời gian thực hiện của cuộc gọi đăng nhập không còn bị ràng buộc với thời gian thực thi ứng dụng của bạn. – MrName