2010-10-07 38 views
30

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

29

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

+0

"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ì? –

0

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.

+0

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

+0

@ 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

+1

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 –

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