Оператор импорта Python в цикле: выполняется ли импорт при каждой итерации цикла?

Код, который я пишу, я запускаю scipy.curve_fit() десятки тысяч раз. Я заметил в соответствующий curve_fit() исходный код, особенно в строках 430 и 431 в источник (в функции leastsq()) есть два оператора import:

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

Я вызываю curve_fit() внутри цикла. Мне интересно, сохраняются ли модули, загруженные этими операторами import, после завершения итерации цикла или модули выходят за рамки и их необходимо перезагружать на каждой итерации цикла.

Примечание. Операторы import вызываются только в том случае, если оператор if full_output: в строке 427 исходного кода имеет значение true. full_output=1 - это то, что передается в leastsq() с помощью curve_fit(), поэтому операторы 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

Что случилось с этим?


person NeutronStar    schedule 15.06.2015    source источник
comment
Возможные дубликаты: stackoverflow.com/questions/296036/, stackoverflow.com/questions/12487549/   -  person ev-br    schedule 15.06.2015
comment
@ev-br, эти вопросы не совсем то, что я задаю. По сути, я спрашиваю, выпадают ли модули, импортированные в цикл, за пределы области действия, когда итерация цикла заканчивается, или код удерживает их.   -  person NeutronStar    schedule 15.06.2015


Ответы (1)


Это поведение не имеет ничего общего с циклом, все дело в этой функции. Как говорит доктор,

Базовый оператор импорта (предложение no from) выполняется в два этапа: найдите модуль, загрузите и при необходимости инициализируйте его, определите имя или имена в локальном пространстве имен для области, в которой происходит оператор импорта.

И у функций есть своя область видимости, поэтому вы не можете видеть импортированный модуль вне его.

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

person Cassum    schedule 15.06.2015