在函数内导入 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 在第一次导入模块后缓存模块(参见 reload
和 sys.modules
)。
最佳实践显然是使用模块级导入,这就是您在 99.999% 的代码中看到的。一个重要的原因是可维护性 - 如果您想了解模块具有哪些依赖项,只需查看顶部就很方便,而不必梳理所有代码。
那么什么时候使用函数本地导入?
三种情况:
您不能使用更早的导入。这发生在例如通过配置或系统检查在 运行 时选择数据库或其他 system/functionality 的后端。
否则你有循环导入。这是一种罕见的情况,也是代码异味,因此如果有必要,请考虑重构。
通过推迟模块导入来减少启动时间。不过这很少有用。
因此对于您的情况,答案是快速而简单的 "don't do it"。
模块会在你导入的时候加载,所以如果你需要导入一个很少用到的模块,但是需要花费大量的时间来初始化,你应该在需要的时候再导入。
实际上,如果我们只关心性能而不关心可读性,那么当我们真正需要它时导入模块可能总是更好。
但是我们需要保持程序的可维护性。 import all modules on the top是最明确的方式告诉别人和作者自己使用了哪些模块。
综上所述,如果你真的有一个非常昂贵但很少使用的模块,你应该在本地导入它。否则你应该在顶部导入它们。
假设我想导入一个 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 在第一次导入模块后缓存模块(参见 reload
和 sys.modules
)。
最佳实践显然是使用模块级导入,这就是您在 99.999% 的代码中看到的。一个重要的原因是可维护性 - 如果您想了解模块具有哪些依赖项,只需查看顶部就很方便,而不必梳理所有代码。
那么什么时候使用函数本地导入?
三种情况:
您不能使用更早的导入。这发生在例如通过配置或系统检查在 运行 时选择数据库或其他 system/functionality 的后端。
否则你有循环导入。这是一种罕见的情况,也是代码异味,因此如果有必要,请考虑重构。
通过推迟模块导入来减少启动时间。不过这很少有用。
因此对于您的情况,答案是快速而简单的 "don't do it"。
模块会在你导入的时候加载,所以如果你需要导入一个很少用到的模块,但是需要花费大量的时间来初始化,你应该在需要的时候再导入。
实际上,如果我们只关心性能而不关心可读性,那么当我们真正需要它时导入模块可能总是更好。
但是我们需要保持程序的可维护性。 import all modules on the top是最明确的方式告诉别人和作者自己使用了哪些模块。
综上所述,如果你真的有一个非常昂贵但很少使用的模块,你应该在本地导入它。否则你应该在顶部导入它们。