在函数内导入 python 库与全局导入之间的区别?

Difference between importing python library within function versus importing globally?

假设我想导入一个 python 库以在函数内部使用。函数内导入库好还是全局导入好?

这样做

def test_func:
    import pandas as pd
    # code implementation

或者 python 文件顶部的下面一行要全局导入?

import pandas as pd

每种方法的优缺点是什么? python 中的最佳做法是什么?

我正在使用 python v3.6

编辑:需要澄清的地方。

假设我有 2 个函数。

def func1:
    import pandas as pd
    # code implementation   

def func2:
    import pandas as pd
    # code implementation   

python 脚本运行这两个函数。库会被导入两次还是 python 编译器足够聪明只导入一次?这会影响性能。

这是名称可见性和执行时间点的差异。当导入您正在加载的文件或 运行 本身时,将导入模块级导入。函数局部显然只有当函数是运行。导入的名称要么对文件中的所有内容可见,要么仅在执行导入的函数中可见。

由于命中导入语句是有代价的(虽然很小,但仍然如此),本地语句将总是执行,而不是只执行一次。它不会完全重新导入模块,python 在第一次导入模块后缓存模块(参见 reloadsys.modules)。

最佳实践显然是使用模块级导入,这就是您在 99.999% 的代码中看到的。一个重要的原因是可维护性 - 如果您想了解模块具有哪些依赖项,只需查看顶部就很方便,而不必梳理所有代码。

那么什么时候使用函数本地导入?

三种情况:

  • 您不能使用更早的导入。这发生在例如通过配置或系统检查在 运行 时选择数据库或其他 system/functionality 的后端。

  • 否则你有循环导入。这是一种罕见的情况,也是代码异味,因此如果有必要,请考虑重构。

  • 通过推迟模块导入来减少启动时间。不过这很少有用。

因此对于您的情况,答案是快速而简单的 "don't do it"。

模块会在你导入的时候加载,所以如果你需要导入一个很少用到的模块,但是需要花费大量的时间来初始化,你应该在需要的时候再导入。

实际上,如果我们只关心性能而不关心可读性,那么当我们真正需要它时导入模块可能总是更好。

但是我们需要保持程序的可维护性。 import all modules on the top是最明确的方式告诉别人和作者自己使用了哪些模块。

综上所述,如果你真的有一个非常昂贵但很少使用的模块,你应该在本地导入它。否则你应该在顶部导入它们。