加班时间,我为各种事情建立了实用程序功能的集合。
我想将它们全部包装在一起,其结构要比仅包含所有功能的单个文件要多。
其中某些函数是在假设某些软件包已导入的情况下编写的,例如我有几个numpy
和pandas
实用程序函数,它们假设类似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
答案 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
语句,因为我总是觉得它们会使函数体膨胀,从而降低可读性。