Đó là bởi vì:
from win32com.client import Dispatch
tương đương với:
import win32com.client #import the whole module first
Dispatch = win32com.client.Dispatch #assign the required attributes to global variables
del win32com #remove the reference to module object
Nhưng from win32com.client import Dispatch
có lợi thế riêng của mình, ví dụ nếu bạn đang sử dụng win32com.client.Dispatch
nhiều lần trong mã của bạn thì đó là tốt hơn để gán nó cho một biến, do đó số lượng tra cứu có thể được giảm. Nếu không, mỗi cuộc gọi đến win32com.client.Dispatch()
trước tiên sẽ tìm kiếm tìm kiếm win32com
và sau đó client
bên trong win32com
và cuối cùng là Dispatch
bên trong win32com.client
.
Byte-code so sánh:
Từ mã byte rõ ràng là số bước cần thiết cho from os.path import splitext
là lớn hơn đơn giản import
.
>>> def func1():
from os.path import splitext
...
>>> def func2():
import os.path
...
>>> import dis
>>> dis.dis(func1)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('splitext',))
6 IMPORT_NAME 0 (os.path)
9 IMPORT_FROM 1 (splitext)
12 STORE_FAST 0 (splitext)
15 POP_TOP
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
>>> dis.dis(func2)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (os.path)
9 STORE_FAST 0 (os)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Mô-đun bộ nhớ đệm:
Lưu ý rằng sau khi from os.path import splitext
bạn vẫn có thể truy cập vào os
mô-đun sử dụng sys.modules
vì cache python module nhập khẩu.
Từ docs:
Note Vì lý do hiệu quả, mỗi mô-đun chỉ được nhập khẩu một lần mỗi phiên dịch viên. Do đó, nếu bạn thay đổi mô-đun, bạn phải khởi động lại trình thông dịch - hoặc, nếu chỉ là một mô-đun bạn muốn thử nghiệm tương tác, hãy sử dụng reload()
, ví dụ: reload(modulename)
.
Demo:
import sys
from os.path import splitext
try:
print os
except NameError:
print "os not found"
try:
print os.path
except NameError:
print "os.path is not found"
print sys.modules['os']
đầu ra:
os not found
os.path is not found
<module 'os' from '/usr/lib/python2.7/os.pyc'>
so sánh Thời gian:
$ python -m timeit -n 1 'from os.path import splitext'
1 loops, best of 3: 5.01 usec per loop
$ python -m timeit -n 1 'import os.path'
1 loops, best of 3: 4.05 usec per loop
$ python -m timeit -n 1 'from os import path'
1 loops, best of 3: 5.01 usec per loop
$ python -m timeit -n 1 'import os'
1 loops, best of 3: 2.86 usec per loop
Tôi thích câu trả lời này tốt hơn! –
Nó tuyệt vời một câu trả lời - bao gồm: * khái niệm *, * thực tế-proof *, và * doc-standard *. Câu trả lời hay nhất như bất cứ ai cũng có thể nhận được. –
Giải thích toàn diện, cảm ơn! – TheoretiCAL