我正在开发一个 Python 程序,即使缺少某些功能所需的一些库,它也需要能够运行。(编辑:我写了一些代码来实现最好的建议解决方案,它在这里,这里有一个文档测试。)
我通过将此类库的导入语句内联到使用它们的函数而不是 Python 文件的顶部来解决这个问题。这意味着即使您没有库,您也可以很好地加载文件,当然,如果您尝试调用其中一个函数,您会抛出 ImportError。
这工作得非常好,以至于我发现自己有时也会为标准库模块这样做——但现在我想知道这样做是否会产生一些隐性成本?
基线代码:
import numpy
def foo():
return numpy.array([])
def bar():
return numpy.array([1, 2, 3])
内联导入的代码:
def foo():
import numpy
return numpy.array([])
def bar():
import numpy
return numpy.array([1, 2, 3])
编辑:
我完全同意不内联标准库代码 - 显然很糟糕。
我现在认为受保护的导入是正确的解决方案。
特别是,我对调用进行了一些时间测试,虽然时间差异对于大多数应用程序可能并不显着,但它是可观的(细线,我知道!)
在琐碎的情况下
import numpy
def f():
return numpy
在我的机器上重复 100,000 次大约需要 180 毫秒,但是
def f():
import numpy
return numpy
大约需要 870 毫秒。
非常粗略的一点是,这会花费多达四个微不足道的函数调用——在大多数情况下很明显但并不重要。不过,如果这样做不花钱,最好避免。
在实验中,我还意识到内联导入的另一个缺点——这些导入在函数被调用时会在不可预测的时间发生。在我的具有实时元素的应用程序中,这是不可接受的。