【问题标题】:Will module import in function that is looped loop the import?循环导入的函数中的模块导入是否会循环导入?
【发布时间】:2012-11-27 11:35:50
【问题描述】:

我还没有达到我有工具(或知道如何开发或使用它们)来测试和分析看似简单的问题(例如我的问题)的水平,所以我求助于你。

我有一个检查条件的函数,并根据该条件选择最好的数学工具(不同的模块),但这个函数应用于数组的窗口,因此是循环的。从一个窗口到另一个窗口可能会发生不同的导入,但这让我想知道这些导入是否真的被循环了,这是否是一个性能问题。

这是一个来自 matplotlib 源代码的示例

def pause(interval):
    """
    Pause for *interval* seconds.

    If there is an active figure it will be updated and displayed,
    and the GUI event loop will run during the pause.

    If there is no active figure, or if a non-interactive backend
    is in use, this executes time.sleep(interval).

    This can be used for crude animation. For more complex
    animation, see :mod:`matplotlib.animation`.

    This function is experimental; its behavior may be changed
    or extended in a future release.

    """
    backend = rcParams['backend']
    if backend in _interactive_bk:
        figManager = _pylab_helpers.Gcf.get_active()
        if figManager is not None:
            canvas = figManager.canvas
            canvas.draw()
            show(block=False)
            canvas.start_event_loop(interval)
            return

    # No on-screen figure is active, so sleep() is all we need.
    import time
    time.sleep(interval)

如果我在循环中交替打开和关闭数字,是否会每隔一次迭代导入时间?还是只是在第一次调用导入时导入而忽略后续导入?

谢谢

【问题讨论】:

  • 这一定是个傻问题,我被验证了两次,第一次输入错误T_T

标签: python


【解决方案1】:

import 成功完成后,导入的模块缓存在sys.modules 中,后续import 语句将在sys.modules 中找到该模块,因此不会重新导入该模块。您可以使用 reload 内置函数强制重新导入模块。

来自the documentation

导入搜索期间检查的第一个位置是sys.modules。此映射用作先前已导入的所有模块的缓存,包括中间路径。因此,如果之前导入了 foo.bar.bazsys.modules 将包含 foofoo.barfoo.bar.baz 的条目。

PEP 8(Python 风格指南)建议导入应该在文件的顶部,而不是在方法中。打破此规则(给出“延迟导入”)的正当理由是,如果模块导入很昂贵并且在您的程序中很少使用(并且在典型的执行中根本不使用),或者解决循环导入依赖关系(尽管在那个如果您应该尝试通过更好地拆分模块功能来解决循环问题)。对于像 time 这样内置于 Python 的模块,几乎没有理由使用延迟导入。

【讨论】:

    【解决方案2】:

    import 的实际操作只发生一次(这就是为什么当您确实希望再次导入它时明确需要reload)- 解释器检查它是否已经被导入。

    但通常更pythonic 将所有导入放在模块的顶部。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多