在 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 设置为任何其他名称,您可以安全地将导入移出循环并保存自己的那些检查.如果有这样的代码,那么重构它不使用相同的名称,并将导入移出循环。