To dlatego, że:
from win32com.client import Dispatch
odpowiada:
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
Ale from win32com.client import Dispatch
ma swoje zalety, na przykład jeśli używasz win32com.client.Dispatch
wiele razy w kodzie to jest to lepiej przypisać ją do zmiennej, aby zmniejszyć liczbę wyszukiwań. W przeciwnym razie każde połączenie z numerem win32com.client.Dispatch()
będzie najpierw wyszukiwać pod kątem win32com
, a następnie w win32com
, a na końcu Dispatch
w wersji win32com.client
.
Porównanie Byte-code:
z kodu bajtowego jasno wynika, że liczba kroków wymaganych do from os.path import splitext
są większe niż proste 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
Moduł buforowania:
pamiętać, że po from os.path import splitext
nadal można uzyskać dostęp za pomocą modułu os
sys.modules
ponieważ buforuje python importowanych modułów.
Od docs:
Uwaga W celu zapewnienia skuteczności, każdy moduł jest importowany tylko raz na sesji interpretera. Dlatego, jeśli zmienisz moduły, musisz ponownie uruchomić interpreter - lub, jeśli jest to tylko jeden moduł, który chcesz interaktywnie przetestować , użyj reload()
, np. 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']
wyjściowe:
os not found
os.path is not found
<module 'os' from '/usr/lib/python2.7/os.pyc'>
porównania czasowe:
$ 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
Podoba mi się ta odpowiedź lepiej! –
To wspaniała odpowiedź - zawiera: * pojęcie *, * praktyczny dowód * i * dokumentację standardową *. Najlepsza odpowiedź, jaką każdy może uzyskać. –
Kompleksowe wyjaśnienie, dzięki! – TheoretiCAL