1

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

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

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

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

谢谢

4

2 回答 2

5

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

文档中

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

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

于 2012-11-27T11:39:51.353 回答
1

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

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

于 2012-11-27T11:42:08.727 回答