是否在函数调用中使用Python 3+导入包?

时间:2018-11-18 08:21:53

标签: python

加班时间,我为各种事情建立了实用程序功能的集合。

我想将它们全部包装在一起,其结构要比仅包含所有功能的单个文件要多。

其中某些函数是在假设某些软件包已导入的情况下编写的,例如我有几个numpypandas实用程序函数,它们假设类似import numpy as np

很显然,我不会使用像from <pkg> import *这样的假设程序包,但是我也不想妨碍性能。

因此,如果我有一个numpy实用程序功能,应该将其添加到每个功能中

# mypkg.np.utils
import sys

def np_util_fn(...):
    if 'np' not in sys.modules: import numpy as np
    # rest of func

# mypkg.np.utils
import sys
if 'np' not in sys.modules: import numpy as np    

def np_util_fn(...):
    # rest of func

如果我使用此软件包的其他部分,哪个性能更高?例如from pkg.other.utils import fn

1 个答案:

答案 0 :(得分:3)

好的,让我们分析一下您的问题。假设您有一个文件module.py

print("Module got imported")

和带有以下内容的文件test.py

import module
import module

。如果您现在执行test.py,您将得到

Module got imported

。请注意,此行不会输出两次。这意味着python已经检查了模块是否已经导入(在重新导入之前)。因此不需要您的支票if 'np' not in sys.modules: import numpy as np。此检查只会延迟执行操作,因为它可能会导致再次检查。

如果要重新导入模块,则需要reload(module)。所以如果你有

import module
import module
reload(module)

code.py中,您将看到两次Module got imported行。

这意味着

import numpy as np

就足够了。无需检查是否已通过以下方式导入

if 'np' not in sys.modules: import numpy as np

这取决于在脚本的开始或在函数中进行import numpy as np是否有利。如果函数多次执行,则仅在一开始执行该操作是有利的。否则,您将一直检查sys.modules中是否始终没有'np'。相反,如果您可以争辩说您的函数未经常调用/不一定在程序中执行(例如,因为它取决于用户输入),则导入该函数可能是有利的(从速度的“点vu”看)只能在功能中使用。

我通常在函数中不使用任何import语句,因为我总是觉得它们会使函数体膨胀,从而降低可读性。