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

时间:2017-10-10 08:51:50

标签: python python-3.x python-import

假设我想导入一个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编译器足够智能只导入一次?这有性能影响。

2 个答案:

答案 0 :(得分:3)

这是名称可见性和执行时间点的差异。导入或自行运行要加载的文件时,将导入模块级导入。功能本地功能显然只有在运行功能时。导入的名称对文件中的所有内容都可见,或者只在执行导入的函数中可见。

由于命中导入语句会有成本(虽然很小但是仍然存在),本地语句将始终执行,而不仅仅是一次。它不会完全重新导入模块,python会在第一次导入模块时缓存模块(参见reloadsys.modules)。

最佳做法显然是使用模块级导入,这就是您在99.999%的代码中看到的内容。一个很大的原因是可维护性 - 如果你想了解模块的依赖关系,只需查看顶部就可以了,而不必梳理所有代码。

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

有三种情况:

  • 您之前无法使用导入。这发生在例如在运行时通过配置或系统检查选择数据库或其他系统/功能的后端。

  • 否则您有循环导入。这是一种罕见的情况,也是一种代码嗅觉,所以如果有必要,请考虑重构。

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

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

答案 1 :(得分:1)

导入模块时会加载模块,因此如果需要导入很少使用的模块但需要花费大量时间进行初始化,则应在需要时导入模块。

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

但我们需要保持我们的程序可维护。导入顶部的所有模块是告诉其他人和作者自己使用哪些模块的最明确方式。

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