【问题标题】:Python import statement in a loop: does import run every loop iteration?循环中的 Python 导入语句:导入是否运行每个循环迭代?
【发布时间】:2023-03-28 01:10:01
【问题描述】:

对于我正在编写的代码,我正在运行scipy.curve_fit() 数万次。我注意到在relevant curve_fit() source code,特别是在源代码中的lines 430 和431(在leastsq() 函数中),有两个import 语句:

from numpy.dual import inv
from numpy.linalg import LinAlgError

我在循环中调用curve_fit()。我想知道这些 import 语句加载的模块是否会在循环迭代完成后保留,或者模块是否超出范围并需要在循环的每次迭代中重新加载。

注意:import 语句仅在源代码第 427 行上的 if full_output: 语句计算结果为真时才被调用。 full_output=1curve_fit() 传递给 leastsq() 的内容,因此确实调用了 import 语句。

附加说明:我不是在询问是否多次导入模块(这么多),而是在循环完成后(或在每次循环的迭代)。

更多注释:

>>>for x in range(0,1):
...     import os
... 
>>> os
<module 'os' from '/home/lars/env/common/lib64/python2.7/os.pyc'>

这可行,但如果我改为定义一个函数:

def a(b):
    if a==True:
       import scipy

然后

for i in range(10):
   a(True)
scipy
NameError: name 'scipy' is not defined

这是怎么回事?

【问题讨论】:

标签: python module scope scipy


【解决方案1】:

这种行为与循环无关,都是关于这个功能的。 正如 doc 所说,

基本的 import 语句(没有 from 子句)分两步执行: 找到一个模块,必要时加载并初始化它 在本地命名空间中为 import 语句出现的范围定义一个或多个名称。

而且功能确实有自己的作用域,这就是为什么在它之外看不到导入的模块。

https://docs.python.org/3/reference/simple_stmts.html#the-import-statement

【讨论】: