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

use*_*207 5 python python-import python-3.x

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

做这个

def test_func:
    import pandas as pd
    # code implementation
Run Code Online (Sandbox Code Playgroud)

或者在 python 文件顶部添加以下行以全局导入?

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

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

我正在使用 python v3.6

编辑:需要做出一些澄清。

假设我有两个函数。

def func1:
    import pandas as pd
    # code implementation   

def func2:
    import pandas as pd
    # code implementation   
Run Code Online (Sandbox Code Playgroud)

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

dee*_*ets 7

这是名称可见性和执行时间点的差异。当您正在加载的文件被导入或运行时,模块级导入就会被导入。显然,只有当该函数运行时,该函数才是本地函数。导入的名称对于文件中的所有内容都可见,或者仅在执行导入的函数内可见。

由于命中 import 语句是有成本的(虽然很小,但仍然如此),本地语句将始终执行,而不仅仅是一次。不过,它不会完全重新导入模块,Python 会在第一次导入模块后对其进行缓存(请参阅reloadsys.modules)。

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

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

有以下三种情况:

  • 您不能提前使用导入。例如,当在运行时通过配置或系统检查选择数据库或其他系统/功能的后端时,就会发生这种情况。

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

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

因此,对于您的情况,答案是快速而简单的“不要这样做”。