Tôi hiểu rằng khi bạn nhập mô-đun, tệp đó được biên dịch thành một tệp .pyc
để làm cho tệp nhanh hơn? Tại sao tệp chính cũng không được biên dịch thành .pyc
? Điều này có chậm không? Nó sẽ là tốt hơn để giữ cho các tập tin chính càng nhỏ càng tốt sau đó, hoặc không nó không quan trọng?Tại sao các tập lệnh Python chạy được chính không được biên dịch thành các tệp pyc như mô-đun?
Trả lời
Khi mô-đun được tải, tệp py được "biên dịch byte" thành tệp pyc. Dấu thời gian được ghi trong tệp pyc. Điều này được thực hiện để không làm cho nó chạy nhanh hơn nhưng để tải nhanh hơn. Do đó, nó có ý nghĩa đối với các mô-đun "biên dịch byte" khi bạn tải chúng.
[Chỉnh sửa: Để bao gồm ghi chú, tài liệu tham khảo]
Từ PEP 3147 trên "mã Byte biên soạn":
CPython biên dịch mã nguồn của nó thành "mã byte" và vì lý do hiệu suất, nó lưu trữ mã byte này o n hệ thống tập tin bất cứ khi nào tập tin nguồn có thay đổi. Điều này làm cho việc tải các mô-đun Python nhanh hơn nhiều vì giai đoạn biên dịch có thể được bỏ qua. Khi tệp nguồn của bạn là foo.py, CPython lưu trữ mã byte trong tệp foo.pyc ngay bên cạnh nguồn.
Làm thế nào biên dịch mã byte file là theo dõi liên quan đến Python phiên bản và "py" tập tin thay đổi:
Nó cũng chèn một con số kỳ diệu trong các mã byte biên soạn "pyc" tập tin. Điều này thay đổi bất cứ khi nào Python thay đổi định dạng mã byte, thường trong các bản phát hành chính.
Điều này đảm bảo rằng các tệp pyc được tạo cho các phiên bản VM trước sẽ không gây ra sự cố. Dấu thời gian được sử dụng để đảm bảo rằng tệp pyc khớp với tệp py là được sử dụng để tạo dấu thời gian. Khi số ma thuật hoặc dấu thời gian không khớp, tệp py được biên dịch lại và tệp pyc mới được ghi.
tệp "pyc" không tương thích trên các bản phát hành chính của Python. Khi Python tìm thấy tệp pyc với số ma thuật không phù hợp, nó sẽ quay trở lại quá trình chậm hơn của biên dịch lại nguồn.
Đó là lý do, nếu bạn chỉ phân phối tệp ".pyc" được biên dịch cho cùng một nền tảng sẽ không hoạt động nữa, nếu phiên bản python thay đổi.
Trong Nutshell
Nếu có một tập tin byte biên soạn".pyc "và dấu thời gian của nó chỉ ra rằng nó gần đây sau đó nó sẽ được nạp lên python khôn ngoan khác sẽ dự phòng về cách tiếp cận chậm hơn của tải các tập tin" .py ". Hiệu suất thực hiện của tập tin" .py "không bị ảnh hưởng nhưng tải của "pyc" file nhanh hơn các file "py".
xem xét thực hiện a.py mà nhập khẩu b.py
Typical total performance = loading time (A.py) + execution time (A.py) +
loading time (B.py) + execution time (B.py)
Since loading time (B.pyc) < loading time (B.py)
You should see a better performance by using the byte compiled "pyc" files.
Điều đó nói rằng, nếu bạn có một tập tin script lớn X. py, mô đun hóa nó và chuyển nội dung sang các mô-đun khác dẫn đến việc tận dụng thời gian tải thấp hơn cho tệp được biên dịch mã byte.
Suy luận khác là các mô-đun có xu hướng ổn định hơn tập lệnh hoặc tệp chính. Do đó nó không phải là byte biên dịch cả.
Tài liệu tham khảo
Biên dịch tập lệnh chính sẽ gây phiền toái cho các tập lệnh, ví dụ: /usr/bin
. Tệp .pyc được tạo trong cùng một thư mục, do đó gây ô nhiễm vị trí công cộng.
Nếu tốc độ là một yếu tố quan trọng, sau đó tôi cần phải có kịch bản chính thể đơn giản càng tốt (vì vậy mà hầu hết các mã sẽ được biên dịch)? – George41
@ George41: Theo tham chiếu tài liệu python, tốc độ thực thi không phải là một yếu tố. Đó là thời gian tải nhanh hơn. – pyfunc
Tuy nhiên, trạng thái của tập lệnh có thể bị giảm bằng cách di chuyển hầu hết mã của nó sang một mô-đun và có một tập lệnh khởi động nhỏ để nhập mô-đun đó "nhưng trừ khi bạn có tập lệnh * lớn * có khả năng overkill –
- 1. Tại sao Perl không biên dịch thành các tệp nhị phân như python
- 2. Các tệp bytecode được biên dịch (.pyc) có thể được tạo trong thư mục khác không?
- 3. Tại sao Node.js không được biên dịch trước khi chạy?
- 4. Chạy các tập lệnh Python như PHP
- 5. Tại sao thư viện python không được cung cấp dưới dạng pyc?
- 6. Các tệp Python 2.5 .pyc có tương thích với các tệp Python 2.6 .pyc không?
- 7. Có dễ dàng giải mã đầy đủ các tệp đã được biên dịch (*. Pyc) của python không?
- 8. Khi nào các tệp .pyc được làm mới?
- 9. Làm thế nào để biên dịch tất cả các tệp py thành tệp pyc trong một thư mục bằng cách viết một tập lệnh python?
- 10. Ưu tiên của các tệp được biên dịch bằng python trong nhập khẩu là gì?
- 11. Tại sao hầu như tất cả các ngôn ngữ OO được biên dịch sang bytecode?
- 12. Làm cho Python bỏ qua các tệp .pyc
- 13. Biên dịch tập lệnh ruby thành exe?
- 14. Viết kịch bản bằng Scala: Cách khởi chạy tập lệnh chưa được biên dịch?
- 15. Biên dịch tập lệnh R thành tệp .exe độc lập?
- 16. Caching các đối tượng regex được biên dịch bằng Python?
- 17. Có thể nhập tệp python đã biên dịch không?
- 18. Mã C# không được biên dịch có biên dịch thành IL và chạy trên CLR không?
- 19. Truy xuất tập lệnh văn bản thuần túy từ tập lệnh bash được biên dịch
- 20. Các tệp JSP Java (* __ jsp.java) được biên dịch ở đâu?
- 21. Có thể biên dịch Python nguyên bản (ngoài mã byte pyc) không?
- 22. Tại sao các biến thành viên không được chia sẻ?
- 23. Biên dịch tập lệnh PHP trong Linux
- 24. Phụ thuộc vào các tệp được tạo tại thời điểm biên dịch
- 25. lệnh để biên dịch các tệp c có tệp .a
- 26. Cách biên dịch tập lệnh python thành tệp nhị phân có thể thực thi
- 27. Làm cách nào để tránh các tệp .pyc?
- 28. ghi lại các tập lệnh được lưu tại vị trí
- 29. Mã C# có được biên dịch thành các tệp nhị phân gốc không?
- 30. Tệp Pydev và * .pyc
"mô-đun có xu hướng ổn định hơn tập lệnh hoặc tệp chính". Sự khác biệt giữa hai thuật ngữ đó là gì? Không phải là mô-đun, tệp? Ngoài ra, sự khác biệt giữa thời gian thực hiện và tải là gì? –