在Python中,当你导入一个函数时会发生什么?
在速度和内存效率方面,导入Python模块和/或函数内部的优点和缺点是什么?
是否每次运行函数时都要重新导入,或者不pipe函数是否运行,在开始时可能只重复一次?
每次运行函数时都会重新导入吗?
没有; 或者更确切地说,Python模块在每次导入时都会caching,因此导入第二个(或第三个或第四个)时间实际上并不会强制他们再次执行整个导入过程。
function是否运行一开始是否导入一次?
不,只有在执行该function时才会导入。
至于好处:我想,这取决于。 如果你只能运行一个很less的函数,并且不需要在其他地方导入的模块,那么只在该函数中导入它可能是有益的。 或者如果出现名称冲突或其他原因,您不希望模块中的模块或符号在任何地方都可用,则可能只想将其导入到特定function中。 (当然,在这些情况下,总是from my_module import my_function as f
)。
在一般情况下,这可能不是有益的。 实际上,大多数Python风格指南鼓励程序员将所有导入放在模块文件的开头。
第一次从任何地方(在函数内部或外部) import goo
, goo.py
(或其他可导入的表单),并将sys.modules['goo']
设置为由此构build的模块对象。 在程序的同一运行中(以及函数内部或外部)的任何未来导入,都只需查找sys.modules['goo']
并将其绑定到适当范围的名字goo
。 字典查找和名称绑定是非常快的操作。
假设第一个import
在程序的运行过程中被完全分摊,那么将“合适范围”作为模块级意味着每次使用goo.this
, goo.that
等都是两个字典查找 – 一个用于goo
,另一个用于属性名称。 如果它是“function级别”,则为每次运行函数支付一个额外的本地variables设置(甚至比字典查找部分更快!),但为每个goo.this
保存一个字典查找(交换它用于本地variables查找,非常快) goo.this
(等)访问,基本上减less这种查找所花费的时间。
我们正在谈论几个纳秒,所以这不是一个有价值的优化。 在一个函数中进行import
的一个潜在的实质性优点是,在某个给定的程序运行中根本不需要该函数,例如,该函数总体上处理错误,exception和罕见情况; 如果是这样的话,那么任何不需要该function的运行都不会执行导入操作(这只需要几微秒,而不是纳秒),只有运行需要function才能支付(适度但可测量)的价格。
这仍然是一个优化,只有在极端的情况下才是有价值的,在尝试以这种方式排除微秒之前,还有很多其他的方面我会考虑。
当函数第一次执行时,它会导入一次。
优点:
- 与他们使用的function相关的import
- 易于在包裹周围移动function
缺点:
- 看不到这个模块可能依赖的模块
在函数内部导入将有效地导入模块一次..第一次运行该函数。
它应该导入速度一样快,无论是在顶部导入它,还是在函数运行时。 这通常不是导入def的好理由。 优点? 如果函数没有被调用,它将不会被导入。这实际上是一个合理的原因,如果你的模块只需要用户安装某个模块,如果他们使用你的特定function的话。
如果这不是你这样做的理由,那几乎肯定是一个糟糕的主意。
我可以一般性地build议,不要问:“X会提高我的performance吗? 您使用分析来确定您的程序实际上在哪里花费时间,然后根据您获得最大收益的位置应用优化?
然后,您可以使用分析来确保您的优化实际上也使您受益。
在第一次调用函数时会导入一次。
我可以想象这样做,如果我在一个很less使用的导入模块中有一个函数,并且是唯一需要导入的模块。 看起来很牵强,虽然…