在 python 中的循环中导入某些内容的副作用是什么?
What is the side effect of importing something inside a loop in python?
我一直在维护一个项目。我发现有人写了一个函数,他在 for 循环中做了一个 import 语句,就像这样
for obj in obj_list:
from Levenshtein._levenshtein import distance
if distance(obj.title, "some string") <= 2:
do something
我假设在 for 循环中导入某些内容会导致不必要的指令执行。因此,我想重构代码。但要做到这一点,我需要一个理由来支持我的假设,即在 for 循环中导入不是一个好的做法。我的假设正确吗?
只需将 import
移出循环。您是正确的,因为这导致 Python 每次迭代都需要一些额外的工作。
一个Python import
语句做了两件事:
- 检查引用的模块是否已经加载,如果没有,加载它。
- 绑定(分配)一个或多个名称。
所以每次循环迭代Python检查模块是否已经加载(大致等同于检查'Levenshtein._levenshtein' in sys.modules
),然后设置名称distance
.
如果循环中 没有其他任何东西 将名称 distance
设置为任何其他名称,您可以安全地将导入移出循环并保存自己的那些检查.如果有这样的代码,那么重构它不使用相同的名称,并将导入移出循环。
我一直在维护一个项目。我发现有人写了一个函数,他在 for 循环中做了一个 import 语句,就像这样
for obj in obj_list:
from Levenshtein._levenshtein import distance
if distance(obj.title, "some string") <= 2:
do something
我假设在 for 循环中导入某些内容会导致不必要的指令执行。因此,我想重构代码。但要做到这一点,我需要一个理由来支持我的假设,即在 for 循环中导入不是一个好的做法。我的假设正确吗?
只需将 import
移出循环。您是正确的,因为这导致 Python 每次迭代都需要一些额外的工作。
一个Python import
语句做了两件事:
- 检查引用的模块是否已经加载,如果没有,加载它。
- 绑定(分配)一个或多个名称。
所以每次循环迭代Python检查模块是否已经加载(大致等同于检查'Levenshtein._levenshtein' in sys.modules
),然后设置名称distance
.
如果循环中 没有其他任何东西 将名称 distance
设置为任何其他名称,您可以安全地将导入移出循环并保存自己的那些检查.如果有这样的代码,那么重构它不使用相同的名称,并将导入移出循环。