在Python中,在函数内部导入时会发生什么情况?

2024-05-20 05:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

就速度和内存效率而言,在函数中导入Python模块和/或函数的利弊是什么?

它是在每次运行函数时重新导入,还是在开始时只导入一次,无论函数是否运行?


Tags: 模块函数内存速度效率利弊
3条回答

当您第一次从任何地方(函数内部或外部)进行import goo时,goo.py(或其他可导入的形式)将被加载,并将sys.modules['goo']设置为这样生成的模块对象。在程序的同一次运行中的任何未来导入(同样,无论是在函数内部还是外部)只需查找sys.modules['goo'],并将其绑定到适当范围内的barenamegoo。dict查找和名称绑定是非常快速的操作。

假设第一个import在程序运行过程中被完全分摊,那么“适当范围”是模块级意味着每次使用goo.thisgoo.that等都是两个dict查找——一个用于goo,一个用于属性名。如果是“函数级”,则每次运行函数时会额外支付一个局部变量设置(甚至比字典查找部分更快!)但是为每个goo.this(etc)访问保存一个dict查找(将其替换为本地变量查找,速度非常快),基本上将这种查找所需的时间减半。

我们正在以某种方式讨论几纳秒,所以这几乎不值得优化。在函数中使用import的一个潜在的实质性优势是,在程序的给定运行过程中可能根本不需要该函数,例如,该函数通常处理错误、异常和罕见情况;如果是这样,任何不需要该功能的运行甚至都不会执行导入(这是节省微秒,而不仅仅是纳秒),只有真正需要该功能的运行才会付出(适度但可测量的)代价。

这仍然是一个优化,只有在非常极端的情况下才有价值,在试图用这种方式挤出微秒之前,我会考虑很多其他的优化。

Does it re-import every time the function is run?

不;或者更确切地说,Python模块在每次导入时基本上都是缓存的,因此导入第二个(或第三个或第四个…)时间实际上并不强迫它们再次经历整个导入过程。1

Does it import once at the beginning whether or not the function is run?

不,它只在函数执行时导入。23

至于好处:我想这要看情况了。如果您可能只很少运行一个函数,并且不需要在其他任何地方导入模块,那么可能有利于只在该函数中导入它。或者,如果存在名称冲突或其他原因,您不希望模块中的一个或多个符号在任何地方都可用,您可能只希望将其导入到特定函数中。(当然,对于那些情况,总是有from my_module import my_function as f。)

一般来说,这可能没什么好处。实际上,大多数Python风格的指南鼓励程序员将所有导入放在模块文件的开头。

当函数第一次执行时导入一次。

优点:

  • 与所用函数相关的导入
  • 易于在包中移动功能

缺点:

  • 无法查看此模块可能依赖的模块

相关问题 更多 >