【问题标题】:When exactly does Python import?Python 究竟什么时候导入?
【发布时间】:2017-12-11 23:38:15
【问题描述】:

问题

如果我将import 语句嵌套在if/else 块中,我会提高效率吗?我知道有些语言会“一次通过”import 的代码和语法问题。我只是不确定 Python 在这方面的深入程度。

我的假设

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

场景

我已经编写了一个脚本,它将被计算机知识较多的人和计算机知识较少的人使用。我的部门对从命令行运行带有参数的脚本非常满意,所以我已经将它设置为接受它需要的参数,如果它没有找到它所期望的参数,它将启动一个带有标题、按钮的 GUI,和更详细的说明。但是,这意味着我正在导入仅在未提供参数的情况下才使用的库。

附加信息

  • GUI 非常、非常基本(六个文本字段和可能更少的按钮),所以我不关心只创建和生成一个自定义 GUI 类,其中将导入必要的库。如果这变得更复杂,我会在未来考虑,甚至推动更改为 Web 界面。
  • 我的脚本功能完全符合我的预期。问题只是关于资源消耗。

【问题讨论】:

  • 这听起来像是一个有效的假设,我假设如果 else: 被调用,你 import somePackage,那么一旦库被使用,del somePackage 来清理资源。
  • @J0hn: del somePackage 不会清除任何东西;在第一次导入时,模块被缓存(因此后续导入不必重新导入它),因此资源仍然保留。 del somePackage 所做的只是删除一个对它的引用。
  • 我重新打开了这个,因为the other question 是关于延迟/按需导入,而这个是关于条件导入(诚然相似)。我认为它应该被链接,但不能被归类为重复。

标签: python python-3.x python-import


【解决方案1】:

import 语句在正常执行时执行,因此如果条件阻止该行执行,则不会发生导入,您将避免不必要的工作。

也就是说,如果要以其他方式导入模块(例如,无条件导入的模块 B 依赖于 A,而您正在有条件地导入 A),那么节省的成本是微不足道的;在第一次导入模块后,后续导入只会获得对同一缓存模块的新引用;导入机制必须先做一些复杂的事情来处理导入钩子等,但在通常情况下,它仍然相当便宜(导入已经缓存的模块时亚微秒)。

这将为您节省任何东西的唯一方法是,如果有问题的模块不会以任何方式导入,在这种情况下,您可以避免加载它的工作以及加载的模块使用的内存。

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 2014-09-09
    • 2023-02-25
    • 2021-11-16
    • 2015-10-12
    • 2019-12-31
    • 2020-10-30
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多