随着时间的推移,我已经为各种事情建立了一系列实用函数。
我想将它们全部放在包中,其结构比仅包含所有功能的单个文件要多一些。
其中一些函数是在假设已导入某些包的情况下编写的,例如我有几个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
最佳答案
好的,我们来分析一下您的问题。假设您有一个文件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 returned
两次。
这意味着
import numpy as np
就足够了。无需检查它是否已通过以下方式导入:
if 'np' not in sys.modules: import numpy as np
这取决于在脚本的开头或函数中执行 import numpy as np
是否有利。如果该函数被执行多次,那么只在最开始时执行是有利的。否则,您将始终重新检查“np”是否不在 sys.modules 中。相反,如果您认为您的函数不经常被调用/不一定在您的程序中执行(例如,因为它取决于用户输入),那么导入此函数可能是有利的(从速度的“点vu”来看)仅在函数中使用模块。
我通常不会在函数中使用任何 import
语句,因为我总感觉它们会破坏函数体,从而降低可读性。
关于Python 3+ 在函数调用中导入包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53359054/