その理由は次のとおりです。
from win32com.client import Dispatch
次と同等です。
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
ただしfrom win32com.client import Dispatch
、独自の利点があります。たとえばwin32com.client.Dispatch
、コードで複数回使用している場合は、変数に割り当てることをお勧めします。これにより、ルックアップの数を減らすことができます。それ以外の場合、 を呼び出すたびに、win32com.client.Dispatch()
最初に search を検索しwin32com
、次にclient
insideを検索しwin32com
、最後にDispatch
insideを検索しwin32com.client
ます。
バイトコード比較:
from os.path import splitext
バイトコードから、 に必要なステップ数が単純な よりも多いことは明らかです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
モジュールのキャッシュ:
Python はインポートされたモジュールをキャッシュするため、引き続きモジュールfrom os.path import splitext
にアクセスできることに注意してください。os
sys.modules
ドキュメントから:
注 効率上の理由から、各モジュールはインタープリター セッションごとに 1 回だけインポートされます。したがって、モジュールを変更した場合は、インタープリターを再起動する必要があります。または、対話的にテストしたいモジュールが 1 つだけの場合はreload()
、reload(modulename)
.
デモ:
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']
出力:
os not found
os.path is not found
<module 'os' from '/usr/lib/python2.7/os.pyc'>
タイミング比較:
$ 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