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

标签 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

最佳答案

好的,我们来分析一下您的问题。假设您有一个文件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/

相关文章:

python - 将方法添加到python中加载的类/模块

python - 如何在 Python 3.7 中注释异步函数的装饰器类型?

python - Pandas 上的动量投资组合(趋势跟踪)量化模拟

python - 需要编写一个函数来接收颜色列表,并输出它们的负颜色(来自字典的对)

python - 在 Raspberry Pi 终端上使用 Python 中的 OpenCV 显示图像

python - 从 Locust 获取单个任务的统计信息

python - lxml:未知的 includemode 或 @method 属性

python - 当应该有一个值python时,字典不返回

python - 如何使用 python 导出 TSVal 和 TSecr TCP 选项字段?

python - 在 Python 中的现有文件前添加一行