Trong phản ứng của Alex Martelli với Making a Python script Object-Oriented, ông đề cập đến việc đặt mã cấp mô-đun vào một hàm và sau đó gọi hàm nhanh hơn trong Python. Ai đó có thể giải thích lý do tại sao và liệu nó có đúng cho tất cả việc triển khai Python không?Tại sao đặt mã cấp mô-đun vào một hàm và sau đó gọi hàm nhanh hơn trong Python?
5
A
Trả lời
7
Điều này chủ yếu là do tra cứu biến. Tìm kiếm một biến trong phạm vi toàn cầu yêu cầu tra cứu từ điển. Ngược lại, trình biên dịch xác định tên địa phương tĩnh và tham chiếu chúng theo chỉ mục, do đó không cần tra cứu từ điển.
Lưu ý rằng trong Python 2.x sự hiện diện của câu lệnh exec
bên trong một hàm sẽ hủy kích hoạt tối ưu hóa này, vì tên không thể được xác định tĩnh nữa. Trong Python 3.x, exec()
là một hàm bình thường, và do đó nó không được phép thay đổi các biến trong phạm vi cục bộ.
Các vấn đề liên quan
- 1. Dll gọi hàm nhanh hơn sau đó gọi hàm bình thường?
- 2. Tại sao gọi hàm ảo nhanh hơn dynamic_cast?
- 3. Tại sao Clojure nhanh hơn Scala một hàm đệ quy?
- 4. Tại sao hàm isprefix nhanh hơn Startswith trong C#?
- 5. Tại sao hàm hủy python được gọi?
- 6. Tại sao cuộc gọi hàm trống trong python chậm hơn khoảng 15% đối với mã python được biên dịch động
- 7. C#: Tại sao cuộc gọi hàm nhanh hơn so với nội tuyến thủ công?
- 8. Python: tại sao * và ** nhanh hơn/và sqrt()?
- 9. Tại sao ICommand tốt hơn mã phía sau gọi VM?
- 10. Tại sao lặp qua một mảng ngược nhanh hơn sau đó chuyển tiếp
- 11. cách đặt hàm và đối số vào hàng đợi python?
- 12. Mã nhanh hơn trong R
- 13. Tại sao là "sắp xếp()" chậm hơn so với "bản sao, sau đó .sort()" Python của
- 14. Gọi một hàm trong một file riêng biệt trong Python
- 15. Tại sao rõ ràng gọi một hàm tạo trong C++
- 16. Tại sao mã C++ phải được chứa trong các hàm?
- 17. Python - Chuyển hàm vào hàm khác
- 18. Tại sao sử dụng các hàm được xác định trong cùng một mô-đun nhanh hơn cùng một hàm được xác định trong một mô-đun khác?
- 19. Cách gọi hàm * sau * onPreferenceChange?
- 20. Python - Tồn tại một hàm được gọi khi một đối tượng không thực hiện một hàm?
- 21. Trong hàm mẫu C++, tại sao gọi hàm phụ thuộc cho lỗi "không khai báo"?
- 22. Python - Gọi hàm trong mô-đun động
- 23. Hàm ASP.Net VB JavaScript gọi từ Mã Phía sau
- 24. Cách gán một biến trong IF và sau đó trả về biến đó. (Python)
- 25. Tại sao hàm tạo bản sao được gọi thay vì hàm tạo chuyển đổi?
- 26. Sử dụng hàm tạo trong một cuộc gọi hàm?
- 27. chuyển một hàm như một tham số và sau đó thực hiện nó trong một hàm jquery
- 28. Tại sao phiên bản đệ quy của hàm này nhanh hơn?
- 29. Mã trong hàm dựng tĩnh chạy chậm hơn
- 30. Cái nào nhanh hơn và tại sao?
Vì vậy, tôi đoán điều này cũng đúng đối với Jython, IronPython và PyPy? Tất cả chúng có thực hiện phạm vi toàn cầu bằng tra cứu từ điển và phạm vi cục bộ bằng cách sử dụng danh sách không? – inman320
@ inman320: Không, điều này không giữ cho các triển khai Python khác. Trong PyPy, không nên có sự khác biệt về tốc độ giữa mã ở cấp mô-đun hoặc hàm tương ứng (chúng sử dụng trình biên dịch JIT). Tôi không biết các triển khai khác hoạt động như thế nào. –