擅长:python、mysql、java
<p>这确实有一些缺点。</p>
<h2>测试</h2>
<p>如果您希望通过运行时修改来测试模块,那么这可能会使测试变得更加困难。而不是做</p>
<pre><code>import mymodule
mymodule.othermodule = module_stub
</code></pre>
<p>你必须这么做</p>
<pre><code>import othermodule
othermodule.foo = foo_stub
</code></pre>
<p>这意味着您必须全局地修补othermodule,而不是仅仅更改mymodule中的引用所指向的内容。</p>
<h2>依赖项跟踪</h2>
<p>这使得模块所依赖的模块不明显。如果您使用许多第三方库或正在重新组织代码,这尤其令人恼火。</p>
<p>我不得不维护一些遗留代码,在所有地方都使用内联导入,这使得代码极难重构或重新打包。</p>
<h2>业绩说明</h2>
<p>由于python缓存模块的方式,性能没有受到影响。事实上,由于模块位于本地命名空间中,因此在函数中导入模块对性能有轻微的好处。</p>
<h2>顶级进口</h2>
<pre><code>import random
def f():
L = []
for i in xrange(1000):
L.append(random.random())
for i in xrange(10000):
f()
$ time python test.py
real 0m1.569s
user 0m1.560s
sys 0m0.010s
</code></pre>
<h2>导入函数体</h2>
<pre><code>def f():
import random
L = []
for i in xrange(1000):
L.append(random.random())
for i in xrange(10000):
f()
$ time python test2.py
real 0m1.385s
user 0m1.380s
sys 0m0.000s
</code></pre>