Lần đầu tiên bạn import goo
từ mọi nơi (bên trong hoặc bên ngoài một chức năng), goo.py
(hoặc biểu mẫu có thể nhập khác) được tải và sys.modules['goo']
được đặt thành đối tượng mô đun do đó được tạo. Bất kỳ nhập khẩu trong tương lai trong cùng một hoạt động của chương trình (một lần nữa, cho dù bên trong hoặc bên ngoài một chức năng) chỉ cần tra cứu sys.modules['goo']
và ràng buộc nó vào tên mã goo
trong phạm vi thích hợp. Việc tra cứu dict và ràng buộc tên là các hoạt động rất nhanh.
Giả sử đầu tiên import
được hoàn toàn khấu hao theo thời gian của chương trình dù sao, có "phạm vi thích hợp" được mô-đun cấp có nghĩa là mỗi lần sử dụng của goo.this
, goo.that
, vv, là hai tra cứu dict - một cho goo
và một cho tên thuộc tính. Có "mức chức năng" trả thêm một cài đặt biến cục bộ cho mỗi lần chạy hàm (thậm chí nhanh hơn phần tra cứu từ điển!), Nhưng tiết kiệm một lần tra cứu dict (trao đổi nó cho tra cứu biến cục bộ, nhanh chóng) cho mỗi goo.this
(vv) truy cập, về cơ bản giảm một nửa thời gian tra cứu như vậy.
Chúng ta đang nói về một vài nano giây theo cách này hay cách khác, vì vậy nó hầu như không phải là một tối ưu hóa đáng giá. Một lợi thế đáng kể có khả năng là có import
trong một hàm là khi chức năng đó có thể không cần thiết trong một chương trình cụ thể, ví dụ, hàm đó xử lý lỗi, dị thường và các tình huống hiếm gặp nói chung; nếu trường hợp đó xảy ra, bất kỳ lần chạy nào không cần chức năng sẽ không thực hiện việc nhập (và đó là tiết kiệm micro giây, không chỉ là nano giây), chỉ chạy mà không cần chức năng sẽ trả giá (khiêm tốn nhưng có thể đo lường).
Nó vẫn là một tối ưu hóa chỉ đáng giá trong các tình huống khá khắc nghiệt, và có rất nhiều người khác tôi sẽ xem xét trước khi cố gắng để ép ra micro giây theo cách này.
Nguồn
2010-06-22 16:36:27
Không có lợi ích về tốc độ (gọi 'nhập' rất tốn kém, ngay cả khi mô-đun đã được tải). Nếu bạn muốn một lợi ích tốc độ, nó nhanh hơn (nếu bạn truy cập vào mô-đun ít nhất 4-5 lần) để chỉ định mô-đun cho biến cục bộ làm điều đầu tiên bạn làm trong hàm của mình và sau đó truy cập nó thông qua biến cục bộ đó (vì tra cứu biến cục bộ rất nhanh). –
(Tua nhanh tới 26:30 trong video tại http://us.pycon.org/2010/conference/schedule/event/71/ nếu bạn muốn một ví dụ thú vị về cách nhập sai một cách vô lý trong một hàm có thể) –
@Nick: Khi nghe điều này, có vẻ như việc nhập nhiều lần liên tục chậm vì mỗi lần bạn thử và kiểm tra xem nó có được nhập hay không. Bạn đang nói rằng bên ngoài của chức năng nhập khẩu nó và đặt nó như là một biến toàn cầu và lấy biến toàn cầu bên trong chức năng? –