擅长:python、mysql、java
<p>当您第一次从任何地方(函数内部或外部)进行<code>import goo</code>时,<code>goo.py</code>(或其他可导入的形式)将被加载,并将<code>sys.modules['goo']</code>设置为这样生成的模块对象。在程序的同一次运行中的任何未来导入(同样,无论是在函数内部还是外部)只需查找<code>sys.modules['goo']</code>,并将其绑定到适当范围内的barename<code>goo</code>。dict查找和名称绑定是非常快速的操作。</p>
<p>假设第一个<code>import</code>在程序运行过程中被完全分摊,那么“适当范围”是模块级意味着每次使用<code>goo.this</code>,<code>goo.that</code>等都是两个dict查找——一个用于<code>goo</code>,一个用于属性名。如果是“函数级”,则每次运行函数时会额外支付一个局部变量设置(甚至比字典查找部分更快!)但是为每个<code>goo.this</code>(etc)访问保存一个dict查找(将其替换为本地变量查找,速度非常快),基本上将这种查找所需的时间减半。</p>
<p>我们正在以某种方式讨论几纳秒,所以这几乎不值得优化。在函数中使用<code>import</code>的一个潜在的实质性优势是,在程序的给定运行过程中可能根本不需要该函数,例如,该函数通常处理错误、异常和罕见情况;如果是这样,任何不需要该功能的运行甚至都不会执行导入(这是节省微秒,而不仅仅是纳秒),只有真正需要该功能的运行才会付出(适度但可测量的)代价。</p>
<p>这仍然是一个优化,只有在非常极端的情况下才有价值,在试图用这种方式挤出微秒之前,我会考虑很多其他的优化。</p>