2017-07-07 124 views
3

问题

如果我有import语句嵌套在if/else块中,我是否会提高效率?我知道一些语言在代码中“传递”了import和语法问题。我只是不确定深入Python如何进入。什么时候Python导入?

我的假设

因为Python是解释而不是编译,通过嵌套else块中的import陈述,这些库将不会被导入,直到达到该行,从而节省系统资源,除非另有需要。

方案

我写了会被更多的计算机知识都可以使用,而这些都是较小这么一个脚本。我的部门非常适合使用带参数的命令行来运行脚本,因此我已经设置好了它需要的参数,如果它没有找到它期望的参数,它将启动一个带有标题,按钮,和更详细的说明。但是,这意味着我正在导入仅在未提供参数的情况下使用的库。

其他信息

  • 的GUI是非常,非常基本的(半打文本字段,并可能更少的按钮),所以我不关心只是创建和产卵自定义GUI类中必要的库会被导入。如果这变得更加复杂,我将在未来考虑它,甚至推动改变到网络界面。
  • 我的脚本功能完全符合我的预期。问题只是关于资源消耗。
+1

这听起来像是一个有效的假设,我假设如果else:被调用,你会导入somePackage,然后一旦使用了库,del somePackage清除资源。 – J0hn

+3

@ J0hn:'del somePackage'不会清理任何东西;在第一次导入时,模块被缓存(所以后续导入不必重新导入),所以资源仍然保留。所有'del somePackage'都会删除一个引用。 – ShadowRanger

+3

由于[另一个问题](https://stackoverflow.com/q/477096/364696)是关于延迟/按需输入的,我重新打开了这个,而这个是关于有条件的输入(公认是相似的)。我认为它应该被联系起来,但不能归类为重复。 – ShadowRanger

回答

5

import语句在正常执行时遇到,因此如果条件阻止该行被执行,则不会执行导入,您将避免不必要的工作。这就是说,如果模块要以某种其他方式导入(比如说,无条件导入的模块B依赖于A,并且您有条件地导入A),则节省的费用是微不足道的。在第一次导入模块后,后续导入只会获得对同一缓存模块的新引用;进口机械必须先处理一些复杂的东西来处理导入钩子等,但在一般情况下,它仍然相当便宜(导入已经缓存的模块时亚微秒)。

这会为您节省任何东西的唯一方法是如果相关模块不会以任何方式导入,否则您将避免加载它的工作以及加载模块使用的内存。

相关问题