Computer >> Máy Tính >  >> Lập trình >> Python

Tại sao mã Python chạy nhanh hơn trong một hàm?

Người ta thấy rằng nếu mã python được chạy bình thường và sau đó nếu nó được chạy trong một hàm python, nó chạy nhanh hơn trong trường hợp thứ hai. Tôi muốn biết tại sao mã python chạy nhanh hơn trong một hàm.

Người ta thường thấy rằng lưu trữ các biến cục bộ nhanh hơn các biến toàn cục trong một hàm python. Điều này có thể được giải thích như sau.

Ngoài thời gian lưu trữ biến cục bộ / toàn cầu, dự đoán opcode làm cho chức năng nhanh hơn.

CPython là triển khai Python ban đầu mà chúng tôi tải xuống từ Python.org. Nó được gọi là CPython để phân biệt nó với các triển khai Python sau này và để phân biệt việc triển khai công cụ ngôn ngữ với chính ngôn ngữ lập trình Python.

CPython tình cờ được triển khai bằng ngôn ngữ C. CPython biên dịch mã python của chúng tôi thành bytecode và diễn giải bytecode đó trong một vòng lặp đánh giá.

Khi một hàm được biên dịch, các biến cục bộ được lưu trữ trong một mảng có kích thước cố định (không phải là dict) và tên biến được gán cho các chỉ mục. Điều này có thể xảy ra vì bạn không thể thêm động các biến cục bộ vào một hàm. Sau đó, truy xuất một biến cục bộ theo nghĩa đen là tra cứu con trỏ vào danh sách và số tiền tăng lên trên PyObject là không quan trọng.

So sánh điều này với một tra cứu toàn cục, đó là một tìm kiếm dict thực sự liên quan đến một hàm băm, v.v. Ngẫu nhiên, đây là lý do tại sao bạn cần chỉ định toàn cục nếu bạn muốn một biến là toàn cục:nếu bạn gán cho một biến bên trong một phạm vi, trình biên dịch sẽ cấp STORE_FASTs cho quyền truy cập của nó trừ khi bạn yêu cầu nó không làm như vậy.

Nhân tiện, tra cứu toàn cầu vẫn được tối ưu hóa khá tốt. Tra cứu thuộc tính thực sự rất chậm!