我还没有达到我拥有工具(或者知道如何开发或使用它们)的水平,用于测试和分析看似简单的事情,比如我的问题,所以我转向你。
我有一个检查条件的函数,并根据该条件选择最好的数学工具来处理(不同的模块),但是这个函数应用于数组的窗口,因此循环。从一个窗口到另一个窗口可能会出现不同的导入,但这让我想知道导入是否实际上是循环的,以及这是否是一个性能问题。
以下是来自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)
如果我在循环中交替打开和关闭数字将每隔一次迭代导入一次?或者只是在第一次调用导入时导入并忽略后续导入?
由于
答案 0 :(得分:5)
成功完成import
后,导入的模块将缓存在sys.modules
中,后续的import
语句将在sys.modules
中找到该模块,因此模块不会被重新导入。您可以使用reload
内置函数强制重新导入模块。
导入搜索期间检查的第一个位置是
sys.modules
。此映射用作先前已导入的所有模块的缓存,包括中间路径。因此,如果之前已导入foo.bar.baz
,则sys.modules
将包含foo
,foo.bar
和foo.bar.baz
的条目。
PEP 8(Python样式指南)建议导入应位于文件的顶部,而不是方法中。打破此规则(给出“延迟导入”)的有效理由是模块导入是昂贵的并且在程序中很少使用(在典型执行中根本不使用),或者解决循环导入依赖性(尽管如此)你应该尝试通过更好地分割模块功能来解决循环问题。对于像time
这样内置于Python的模块,没有理由使用后期导入。
答案 1 :(得分:1)