ためです:
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
を複数回使用している場合、それはだたとえば、独自の利点があります:
from win32com.client import Dispatch
は同等ですそれを変数に代入する方が良いので、検索回数を減らすことができます。それ以外の場合は、win32com.client.Dispatch()
を呼び出すたびに、win32com
の検索が行われ、の中にはclient
、最後にはDispatch
の中に検索されます。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
モジュールのキャッシング:from os.path import splitext
後、あなたはまだsys.modules
ためのpythonキャッシュインポートモジュールを使用してos
モジュールにアクセスできることを
注意。 docsから
:効率の理由から
注、各モジュールは一度だけ インタプリタセッションごとにインポートされます。したがって、モジュールを変更する場合は、 インタプリタを再起動する必要があります。つまり、対話的に をテストするモジュールが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
私はこの答えが気に入っています! –
それはすばらしい答えです:*コンセプト*、*実用的な*、*文書標準*を含みます。誰かのような最善の答えを得ることができます。 –
包括的な説明、ありがとう! – TheoretiCAL