Nhập khẩu mô-đun không lãng phí bất cứ điều gì ; mô-đun luôn được nhập đầy đủ (vào sys.modules
ánh xạ), do đó, khi bạn sử dụng import sys
hoặc from sys import argv
không có tỷ lệ cược.
Sự khác biệt duy nhất giữa hai câu lệnh là tên nào bị ràng buộc; import sys
liên kết tên sys
với mô-đun (so sys
-> sys.modules['sys']
), trong khi from sys import argv
liên kết một tên khác argv
, chỉ thẳng vào thuộc tính có trong mô-đun (vì vậy argv
-> sys.modules['sys'].argv
). Phần còn lại của sys
mô-đun vẫn còn đó, cho dù bạn có sử dụng bất cứ thứ gì khác từ mô-đun hay không.
Cũng không có sự khác biệt hiệu suất giữa hai phương pháp. Vâng, sys.argv
phải tìm kiếm hai điều; nó phải tra cứu sys
trong không gian tên toàn cầu của bạn (tìm mô-đun), sau đó tra cứu thuộc tính argv
. Và có, bằng cách sử dụng, from sys import argv
bạn có thể bỏ qua việc tra cứu thuộc tính, vì bạn đã có một tham chiếu trực tiếp đến thuộc tính. Nhưng import
câu lệnh vẫn phải thực hiện công việc đó, nó tìm kiếm thuộc tính tương tự khi nhập và bạn sẽ chỉ cần sử dụng argv
một lần . Nếu bạn phải sử dụng argv
hàng ngàn lần trong một vòng lặp thì có lẽ điều đó có thể tạo ra sự khác biệt, nhưng trong trường hợp cụ thể này thì thực sự không phải vậy.
Thay vào đó, sự lựa chọn giữa cái này hay cái khác, nên dựa trên phong cách mã hóa .
Trong một mô-đun lớn , tôi chắc chắn sẽ sử dụng import sys
; mã tài liệu quan trọng, và sử dụng sys.argv
một nơi nào đó trong một mô-đun lớn làm cho nó rõ ràng hơn những gì bạn đang đề cập đến hơn argv
bao giờ hết.
Nếu nơi duy nhất bạn sử dụng argv
là trong một '__main__'
khối để gọi một main()
hàm, bằng mọi cách, hãy sử dụng from sys import argv
nếu bạn cảm thấy hạnh phúc hơn về điều đó:
if __name__ == '__main__':
from sys import argv
main(argv)
Tôi vẫn sẽ sử dụng import sys
ở đó một mình. Tất cả mọi thứ đều bình đẳng (và chính xác là về hiệu suất và số lượng ký tự được sử dụng để viết nó), điều đó dễ dàng hơn đối với tôi.
Nếu bạn đang nhập một cái gì đó khác hoàn toàn, thì có lẽ hiệu suất sẽ phát huy tác dụng. Nhưng chỉ khi bạn sử dụng một tên cụ thể trong một mô-đun nhiều lần , trong một vòng lặp quan trọng chẳng hạn. Nhưng sau đó, việc tạo một tên cục bộ (trong một hàm) sẽ nhanh hơn:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)