gpt4 book ai didi

python - 使用 import inline 是否会产生负面影响?

转载 作者:行者123 更新时间:2023-11-28 19:40:09 25 4
gpt4 key购买 nike

我正在开发一个 Python 程序,即使缺少某些功能所需的某些库,该程序也需要能够运行。 (编辑:我写了一些代码来实现最好的建议解决方案,它是 here ,带有 doctest here 。)

我通过将此类库的导入语句内嵌到使用它们的函数中而不是放在 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])

编辑:

我完全同意不内联标准库代码——这显然很糟糕。

我现在认为 protected 导入是正确的解决方案。

特别是,我对调用进行了一些计时测试,虽然时间差异对于大多数应用程序来说可能并不重要,但它是可观的(细线,我知道!)

在一般情况下

import numpy
def f():
return numpy

在我的机器上大约需要 180 毫秒重复 100,000 次但是

def f():
import numpy
return numpy

大约需要 870 毫秒。

非常粗略的结论是,这会花费多达四个微不足道的函数调用 - 值得注意但在大多数情况下并不重要。不过,如果不需要花费任何费用,最好避免这样做。

在实验中,我还意识到内联导入的另一个缺点 - 这些导入会在调用函数时在不可预测的时间结束。在我的具有实时元素的应用程序中,这是 Not Acceptable 。

最佳答案

没有明显的性能影响,但它会使您的代码变得困惑。如果您决定添加新的导入或必须更改旧的导入,则必须在所有地方进行更改,而不是只在一个地方进行更改。

此外,您应该确保将其记录在案。如果库似乎正确导入但稍后在调用特定函数时失败,一些用户可能会感到恼火。此外,虽然整体性能没有受到影响,但可能会出现性能“重新洗牌”,从而导致意想不到的地方速度下降。第一次调用导入 numpy 的函数时,它必须进行导入,这需要时间。用户也可能会发现这种情况不受欢迎,并希望所有缓慢的导入都预先完成。

您可以通过 all-at-the-top 导入轻松获得类似的效果:

try:
import numpy
except ImportError:
warnings.warn("Numpy not available, some functions may not work!")

稍后尝试使用试图访问 numpy 的函数现在将失败并出现 NameError。通过使用警告(或只是打印/记录的消息),您还可以提前通知某些事情将无法正常工作,而不是稍后突然失败。

关于python - 使用 import inline 是否会产生负面影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com