将模块导入循环的函数循环导入吗?

时间:2012-11-27 11:35:51

标签: python

我还没有达到我拥有工具(或者知道如何开发或使用它们)的水平,用于测试和分析看似简单的事情,比如我的问题,所以我转向你。

我有一个检查条件的函数,并根据该条件选择最好的数学工具来处理(不同的模块),但是这个函数应用于数组的窗口,因此循环。从一个窗口到另一个窗口可能会出现不同的导入,但这让我想知道导入是否实际上是循环的,以及这是否是一个性能问题。

以下是来自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)

如果我在循环中交替打开和关闭数字将每隔一次迭代导入一次?或者只是在第一次调用导入时导入并忽略后续导入?

由于

2 个答案:

答案 0 :(得分:5)

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

来自the documentation

  

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

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

答案 1 :(得分:1)

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

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